Spring @Transactionalメソッド - 参加トランザクション
-
30-09-2019 - |
質問
1つのDAOには、2つの@Transactionalメソッドがあります。
明示的なプロパティを提供しない場合、
次に、何が起こるでしょうか
私は別の本体で1つの方法を実行しますか?
どちらの方法も同じ1つのトランザクション内で実行されますか?
解決
春AOPのプロキシ
トランザクションを使用する場合、クラスのプロキシを扱っているので、このシナリオでは次のとおりです。
@Transactional
public void doSomeThing(){ // calling this method targets a proxy
doSomeThingElse(); // this method targets the actual class, not the PROXY,
// so the transactional annotation has no effect
}
@Transactional
public void doSomeThingElse(){
}
外部からプロキシを呼び出していますが、2番目のメソッド呼び出しはプロキシされたオブジェクトの内側から作成されているため、トランザクションサポートはありません。だから当然、彼らは同じトランザクションで実行されます。2番目の方法の@TransactionAlアノテーションの値は何であろうと
したがって、個別のトランザクションが必要な場合は、電話する必要があります
yourservice.doSomething();
yourservice.doSomethingElse();
外から。
シナリオ全体がこの章でかなりよく説明されています spring aop> AOPプロキシの理解, 、この「解決策」を含む:
内部から現在のAOPプロキシオブジェクトにアクセスします
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
他のヒント
のデフォルト値 propagation
の属性 @Transactional
は REQUIRED
, 、つまり:
現在のトランザクションをサポートし、存在しない場合は新しいトランザクションを作成します。
したがって、はい - 両方の方法は同じトランザクションで実行されます。
しかし、1つの重要なアドバイス: DAOトランザクションを作成しないでください. 。サービスは、DAOではなくトランザクションである必要があります。
1つのメモ:
プロキシモード(デフォルト)では、プロキシを介して入る外部メソッド呼び出しのみがインターセプトされます。これは、実際には、ターゲットオブジェクトの別のメソッドを呼び出すターゲットオブジェクト内のメソッドが、呼び出されたメソッドが@Transactionalでマークされている場合でも、実行時に実際のトランザクションにつながらないことを意味します。