タイトルがすべてを物語っています: UserTransaction
と EntityTransaction
の違いは何ですか?
私の基本的な理解は、JTAが必要な場合(たとえば、複数のクエリを実行する場合)にUserTransaction
が使用され、JPAのみが必要な場合(たとえば、クエリがアトミックな場合)にEntityTransaction
が使用されることです。 。
それが2つの違いだけですか、それともそれ以上のものがありますか?
私の基本的な理解は、UserTransactionはJTAが必要な場合(たとえば、複数のクエリを実行する場合)に使用され、EntityTransactionはJPAのみが必要な場合(たとえば、クエリがアトミックな場合)に使用されるということです。
それは基本的には正しいですが、「複数のもの」と「アトミック」の説明は少し奇妙です。 JTAを使用すると、開発者は分散トランザクションを使用して、複数のリソース(データベース、JMSブローカーなど)に対してアトミックに(オールオアナッシング)変更を実行できます。アクセスされるリソースが1つだけの場合(たとえば、単一のデータベースが1つ)、JTAは必要ありませんが、トランザクションはアトミック(オールオアナッシング)のままです。これは、たとえば、1つのデータベースで通常のJDBCトランザクションを使用する場合です。
UserTransaction
とEntityTransaction
の比較:
EntityTransaction
を使用してトランザクションを自分で区別します。UserTransaction
を使用します。 EntityManager
は、それ自体をJTA分散トランザクションマネージャーにフックします。私が知っている唯一の微妙な点は、変更のフラッシュを考慮しています。 EntityTransaction
が使用されている場合、JPAは変更をフラッシュする必要があることを認識しています。トランザクションがUserTransaction
を使用して制御される場合、トランザクションが完了する前に変更がデータベースにフラッシュされるように、JTA registerSynchronization
を使用してコールバックを登録する必要があります。 CMT(コンテナー管理トランザクション)でEJBを使用する場合は、UserTransaction
を使用する必要もありません。アプリサーバーがトランザクションを開始および停止します。関連する質問: