特定のトランザクション属性を持つトランザクション メソッドが、異なるトランザクション属性を持つ同じ Bean でメソッドを呼び出すとどうなりますか?
2 に答える
Springの標準的なトランザクション構成では、nothinが発生します。ドキュメントから(宣言型トランザクション管理の完全な説明については、リファレンスドキュメントを参照してください):
プロキシモード(デフォルト)では、プロキシを介して着信する外部メソッド呼び出しのみがインターセプトされます。つまり、自己呼び出しは、実際には、ターゲットオブジェクト内のメソッドがターゲットオブジェクトの別のメソッドを呼び出しても、呼び出されたメソッドが@Transactionalでマークされている場合でも、実行時に実際のトランザクションにつながることはありません。
同じBeanでメソッド呼び出しを使用してトランザクションの動作(伝播、読み取り専用ステータスなど)を変更する必要がある場合は、トランザクションモードをAspectJに変更し、コンパイル時のワイビングを使用できます(これを行う方法はこちらをご覧ください)。しかし、テストのためだけに、実際にこれを行ったことはありません。通常、これで十分なデフォルトのトランザクション設定です。
@TransactionalのreadOnly属性には、以下の例外があります。
@Transactional(readOnly=true)
void methodA(){}
@Transactional
void methodB(){}
このようなメソッドを呼び出し、Hibernateまたは他のORMプラットフォームを使用する場合:
methodA();
methodB();
読み取り専用接続例外をスローします。