回答:
Springは独自のTransactionalアノテーションを定義して、Spring Beanメソッドを数年前にトランザクション対応にしました。
Java EE 7はついに同じことを行い、EJBメソッドに加えて、CDI Beanメソッドをトランザクション対応にすることができます。したがって、Java EE 7以降、独自のTransactionalアノテーションも定義されています(明らかにSpringアノテーションを再利用することはできません)。
Java EE 7アプリケーションでは、Java EEアノテーションを使用します。
Springアプリケーションでは、Springアノテーションを使用します。
それらの使い方は同じです。メソッドがトランザクションであることをコンテナ(Java EEまたはSpring)に通知します。
org.springframework.transaction.annotation.Transactional
申し出より多くのオプション(のようなreadOnly
、timeout
より)javax.transaction.Transactional
別の違いは、Springが@Transactionalアノテーションを処理する方法です。
javax.ejb.TransactionAttribute
、クラスパス(バージョン2.5.3から3.2.5まで)でクラスが使用可能かどうかをチェックすることによって行われます。したがってjavax.transaction.Transactional
、がクラスパスにのみ存在し、に存在しない場合、注釈が考慮されなくなる可能性がありますjavax.ejb.TransactionAttribute
。これは、Hibernateを使用している場合に当てはまります。hibernate-core(4.3.7.Final)は、を提供しないjboss-transaction-api_1.2_spec(1.0.0.Final)に依存していますjavax.ejb.TransactionAttribute
。注意してください(この問題はTomcatで発生しました)。
アプリケーションがSPRING Webアプリケーションであり、Springのトランザクション処理メカニズムを使用している場合 @org.springframework.transaction.annotation.Transactional
、javax.transaction.Transactionalと混合しないでください。
それは常に使用します、 @org.springframework.transaction.annotation.Transactional
れ、春のアプリケーションで一貫しています。
そうしないと、このエラーが発生する可能性があります。
org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed
........
Caused by: java.sql.SQLException: Protocol violation: [0]
Spring @Transaction
アノテーションとJPA アノテーションの両方を使用すると、特定のアプリケーショントランザクションのスコープを定義できます。
そのため、サービスメソッドにアノテーションが付けられている@Transactional
場合は、トランザクションコンテキストで実行されます。サービスメソッドが複数のDAOまたはリポジトリを使用する場合、すべての読み取りおよび書き込み操作は同じデータベーストランザクションで実行されます。
@Transactional
このorg.springframework.transaction.annotation.Transactional
アノテーションは、Springフレームワークのバージョン1.2(2005年頃)から利用でき、次のトランザクションプロパティを設定できます。
isolation
:基礎となるデータベース分離レベルnoRollbackFor
and noRollbackForClassName
:Exception
トランザクションのロールバックをトリガーすることなくトリガーできるJava クラスのリストrollbackFor
and rollbackForClassName
:Exception
スローされたときにトランザクションのロールバックをトリガーするJava クラスのリストpropagation
:Propagation
Enum によって指定されたトランザクション伝播タイプ。たとえば、トランザクションコンテキストを継承できる場合(例:)、REQUIRED
新しいトランザクションコンテキストを作成する場合(例:)、REQUIRES_NEW
トランザクションコンテキストが存在しない場合に例外をスローする場合(例:)、MANDATORY
または例外をスローする場合現在のトランザクションコンテキストが見つかった場合(例:)NOT_SUPPORTED
。readOnly
:現在のトランザクションが変更を適用せずにデータのみを読み取るかどうか。timeout
:タイムアウト例外がスローされるまでトランザクションコンテキストの実行を許可する秒数。value
またはtransactionManager
:TransactionManager
トランザクションコンテキストをバインドするときに使用されるSpring Beanの名前。@Transactional
javax.transaction.Transactional
注釈は(2013年頃)は、Java EE 7仕様で添加しました。したがって、Java EEアノテーションは、8年後にその対応するSpringに追加されました。
Java EEが@Transactional
定義する属性は3つだけです。
dontRollbackOn
:Exception
トランザクションのロールバックをトリガーせずにトリガーできるJava クラスのリストrollbackOn
:Exception
スローされたときにトランザクションのロールバックをトリガーするJava クラスのリストvalue
:TxType
Enum によって与えられる伝播戦略。たとえば、トランザクションコンテキストを継承できる場合(例:)、REQUIRED
新しいトランザクションコンテキストを作成する場合(例:)、REQUIRES_NEW
トランザクションコンテキストが存在しない場合に例外をスローする場合(例:)、MANDATORY
または例外をスローする場合現在のトランザクションコンテキストが見つかった場合(例:)NOT_SUPPORTED
。SpringまたはSpring Bootを使用している@Transactional
場合は、Java EE @Transactional
アノテーションよりも多くの属性を構成できるため、Spring アノテーションを使用します。
Java EEのみを使用していて、アプリケーションをJava EEアプリケーションサーバーにデプロイする場合は、Java EEの「@Transactional」アノテーションを使用します。
SpringまたはJava EE
@Transactional
定義を使用する場合の分離レベル構成の違いについて詳しくは、こちらの記事をご覧ください。
javax.transaction.Transactional
ので、追加のアクションなしでSpringアプリケーションでもそれを使用できます。IMO、これは設計の観点からはかなり悪い決定でした。私の経験から、多くの開発者がコードでこれら2つを誤って混乱させ、その後問題が発生するためです。