1 つの dao には、2 つの @Transactional メソッドがあります。
明示的なプロパティを提供しない場合、
だったらどうなるんだろう
あるメソッドを別のメソッドの本体で実行しますか?
両方の方法が同じトランザクション内で実行されますか?
1 つの dao には、2 つの @Transactional メソッドがあります。
明示的なプロパティを提供しない場合、
だったらどうなるんだろう
あるメソッドを別のメソッドの本体で実行しますか?
両方の方法が同じトランザクション内で実行されますか?
Transactional を使用する場合、クラスのプロキシを扱っているため、このシナリオでは次のようになります。
@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 > Understanding AOP proxiesの章でかなり詳しく説明されており、この「ソリューション」も含まれています。
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 を transactional にしないでください。サービスは、DAO ではなくトランザクション対応である必要があります。
1 つのメモ:
プロキシ モード (デフォルト) では、プロキシ経由で着信する外部メソッド呼び出しのみがインターセプトされます。つまり、自己呼び出し、つまり、ターゲット オブジェクト内のメソッドがターゲット オブジェクトの別のメソッドを呼び出している場合、呼び出されたメソッドが @Transactional でマークされていても、実行時に実際のトランザクションは発生しません。