108

としてマークされた Service クラスのメソッドを見てきましたが@Transactional、同じクラスで としてマークされていない他のメソッドも呼び出していました@Transactional

別のメソッドへの呼び出しにより、アプリケーションが DB への別の接続を開くか、親トランザクションを一時停止するなどの原因になっているということですか?

注釈付きの別のメソッドによって呼び出される、注釈のないメソッドのデフォルトの動作は何@Transactionalですか?

4

4 に答える 4

138

@Transactionalトランザクション ブロック内でメソッドを呼び出すと、親トランザクションは新しいメソッドに進みます。親メソッド ( あり@Transactional) からの同じ接続を使用し、呼び出されたメソッド ( なし@Transactional) で例外が発生すると、トランザクション定義で構成されているようにトランザクションがロールバックされます。

@Transactional同じインスタンス内のメソッドからアノテーションを使用してメソッドを呼び出す場合@Transactional、呼び出されたメソッドのトランザクション動作はトランザクションに影響を与えません。ただし、トランザクション定義を持つ別のメソッドからトランザクション定義を持つメソッドを呼び出し、それらが異なるインスタンスにある場合、呼び出されたメソッドのコードは、呼び出されたメソッドで指定されたトランザクション定義に従います。

詳細については、 Spring トランザクション ドキュメントの宣言型トランザクション管理のセクションを参照してください。

Spring 宣言型トランザクション モデルは AOP プロキシを使用します。そのため、AOP プロキシがトランザクションの作成を担当します。AOP プロキシは、インスタンス内のメソッドがインスタンスの外部から呼び出された場合にのみアクティブになります。

于 2011-06-03T03:17:09.757 に答える
24
  • これは、個別のメソッドを呼び出すと、アプリケーションがDBへの個別の接続を開いたり、親トランザクションを一時停止したりすることを意味しますか?

それは伝播レベルに依存します。可能なすべてのレベル値は次のとおりです。

たとえば、伝播レベルがNESTEDの場合、現在のトランザクションは「一時停止」され、新しいトランザクションが作成されます(注:ネストされたトランザクションの実際の作成は、特定のトランザクションマネージャーでのみ機能します) 。

  • @Transactionalアノテーションを持つ別のメソッドによって呼び出されるアノテーションのないメソッドのデフォルトの動作は何ですか?

デフォルトの伝播レベル(「動作」と呼ばれるもの)はREQUIREDです。@Transactionalアノテーションが付いた「内部」メソッドが呼び出された場合(またはXMLを介して宣言的にトランザクション処理された場合)、同じトランザクション内で実行されます。たとえば、「何も新しいものは作成されません」。

于 2012-01-17T22:38:49.503 に答える
9

@Transactional はトランザクション境界 (開始/終了) をマークしますが、トランザクション自体はスレッドにバインドされます。トランザクションが開始されると、元のメソッドが返され、トランザクションがコミット/ロールバックされるまで、メソッド呼び出し全体に伝播されます。

@Transactional アノテーションを持つ別のメソッドが呼び出された場合、伝播はそのアノテーションの伝播属性に依存します。

于 2011-06-03T12:17:33.397 に答える