javax.transaction.Transactionalとorg.springframework.transaction.annotation.Transactional


152

アノテーションjavax.transaction.Transactionalとの実際の違いは何org.springframework.transaction.annotation.Transactionalですか?

あるorg.springframework.transaction.annotation.Transactionalの延長javax.transaction.Transactionalや、彼らは全く異なる意味を持っていますか?それぞれいつ使用すべきですか?@Transactinalサービスレイヤーの春とDAOのjavax

回答ありがとうございます。

回答:


125

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)に通知します。


28
それ以上:宇宙を支配するために、Springは暗黙的なサポートも追加したjavax.transaction.Transactionalので、追加のアクションなしでSpringアプリケーションでもそれを使用できます。IMO、これは設計の観点からはかなり悪い決定でした。私の経験から、多くの開発者がコードでこれら2つを誤って混乱させ、その後問題が発生するためです。
Yuriy Nakonechnyy 2016年

16
さらに、org.springframework.transaction.annotation.Transactional申し出より多くのオプション(のようなreadOnlytimeoutより)javax.transaction.Transactional
pierrefevrier

1
@ゆら、どんな問題を観察しましたか?
Lee Chee Kiam 2017

1
@LeeCheeKiamは以下の2つの回答をご覧ください
Yuriy Nakonechnyy

50

別の違いは、Springが@Transactionalアノテーションを処理する方法です。

  • org.springframework.transaction.annotation.Transactionalは常に考慮されます
  • javax.transaction.Transactionalは、EJB3トランザクションが存在する場合にのみ考慮されます。EJB3トランザクションの存在は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


プライベートメソッドで使用される場合など、常に使用されるわけではありません。
18年

36

注意してください(この問題は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]

1
注:この答えは私の答えの特殊なケースである
ジデヘム

3

宣言的なトランザクションスコープ

Spring @TransactionアノテーションとJPA アノテーションの両方を使用すると、特定のアプリケーショントランザクションのスコープを定義できます。

そのため、サービスメソッドにアノテーションが付けられている@Transactional場合は、トランザクションコンテキストで実行されます。サービスメソッドが複数のDAOまたはリポジトリを使用する場合、すべての読み取りおよび書き込み操作は同じデータベーストランザクションで実行されます。

@Transactional

このorg.springframework.transaction.annotation.Transactionalアノテーションは、Springフレームワークのバージョン1.2(2005年頃)から利用でき、次のトランザクションプロパティを設定できます。

  • isolation:基礎となるデータベース分離レベル
  • noRollbackForand noRollbackForClassNameExceptionトランザクションのロールバックをトリガーすることなくトリガーできるJava クラスのリスト
  • rollbackForand rollbackForClassNameExceptionスローされたときにトランザクションのロールバックをトリガーするJava クラスのリスト
  • propagationPropagationEnum によって指定されたトランザクション伝播タイプ。たとえば、トランザクションコンテキストを継承できる場合(例:)、REQUIRED新しいトランザクションコンテキストを作成する場合(例:)、REQUIRES_NEWトランザクションコンテキストが存在しない場合に例外をスローする場合(例:)、MANDATORYまたは例外をスローする場合現在のトランザクションコンテキストが見つかった場合(例:)NOT_SUPPORTED
  • readOnly:現在のトランザクションが変更を適用せずにデータのみを読み取るかどうか。
  • timeout:タイムアウト例外がスローされるまでトランザクションコンテキストの実行を許可する秒数。
  • valueまたはtransactionManagerTransactionManagerトランザクションコンテキストをバインドするときに使用されるSpring Beanの名前。

Java EE @Transactional

javax.transaction.Transactional注釈は(2013年頃)は、Java EE 7仕様で添加しました。したがって、Java EEアノテーションは、8年後にその対応するSpringに追加されました。

Java EEが@Transactional定義する属性は3つだけです。

  • dontRollbackOnExceptionトランザクションのロールバックをトリガーせずにトリガーできるJava クラスのリスト
  • rollbackOnExceptionスローされたときにトランザクションのロールバックをトリガーするJava クラスのリスト
  • valueTxTypeEnum によって与えられる伝播戦略。たとえば、トランザクションコンテキストを継承できる場合(例:)、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定義を使用する場合の分離レベル構成の違いについて詳しくは、こちらの記事をご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.