web-dev-qa-db-ja.com

UserTransactionとEntityTransactionの違い

タイトルがすべてを物語っています: UserTransactionEntityTransaction の違いは何ですか?

私の基本的な理解は、JTAが必要な場合(たとえば、複数のクエリを実行する場合)にUserTransactionが使用され、JPAのみが必要な場合(たとえば、クエリがアトミックな場合)にEntityTransactionが使用されることです。 。

それが2つの違いだけですか、それともそれ以上のものがありますか?

21
bguiz

私の基本的な理解は、UserTransactionはJTAが必要な場合(たとえば、複数のクエリを実行する場合)に使用され、EntityTransactionはJPAのみが必要な場合(たとえば、クエリがアトミックな場合)に使用されるということです。

それは基本的には正しいですが、「複数のもの」と「アトミック」の説明は少し奇妙です。 JTAを使用すると、開発者は分散トランザクションを使用して、複数のリソース(データベース、JMSブローカーなど)に対してアトミックに(オールオアナッシング)変更を実行できます。アクセスされるリソースが1つだけの場合(たとえば、単一のデータベースが1つ)、JTAは必要ありませんが、トランザクションはアトミック(オールオアナッシング)のままです。これは、たとえば、1つのデータベースで通常のJDBCトランザクションを使用する場合です。

UserTransactionEntityTransactionの比較:

  • JPAがスタンドアロンで使用されている場合は、EntityTransactionを使用してトランザクションを自分で区別します。
  • JPAがJTAと統合される管理環境内で使用される場合は、UserTransactionを使用します。 EntityManagerは、それ自体をJTA分散トランザクションマネージャーにフックします。私が知っている唯一の微妙な点は、変更のフラッシュを考慮しています。 EntityTransactionが使用されている場合、JPAは変更をフラッシュする必要があることを認識しています。トランザクションがUserTransactionを使用して制御される場合、トランザクションが完了する前に変更がデータベースにフラッシュされるように、JTA registerSynchronization を使用してコールバックを登録する必要があります。 CMT(コンテナー管理トランザクション)でEJBを使用する場合は、UserTransactionを使用する必要もありません。アプリサーバーがトランザクションを開始および停止します。

関連する質問:

24
ewernli