伝播=必須の @Transactional の動作についてはあまり明確ではありません。ウェブでよく参照される例は次のとおりです。
public void callerMethod() {
call1();
call2();
}
@Transactional(propagation=REQUIRED)
public void call1() {
}
@Transactional(propagation=REQUIRED)
public void call2() {
}
私が読んだことは、call2() が呼び出されると、伝播ポリシーが必要であるため、「利用可能な場合は既存のトランザクション」を使用することです。
私の質問は、 call1() が呼び出されたときに、 call1() の最後にある tx プロキシ コード (Spring の AOP によって追加された) がトランザクションを閉じないのですか? そうでない場合、既存の tx を閉じないための基準は何ですか? たとえば、間に非トランザクション メソッドへの呼び出しがいくつかあるとします。
public void callerMethod() {
call1();
call3();
call2();
}
public void call3() {
}
この場合、 call2() は call1() によって開始された tx 内で呼び出されますか?
とにかく、最初のケース (call1() と call2() が連続して呼び出される) で、call2() が runtimeException をスローすると、tx 全体がロールバックします。これは、メソッド全体が一緒に失敗するか、一緒に成功する必要があると宣言しているため、call1() の宣言にはかなり予想外になりますが、すべてのコードが成功したにもかかわらず、tx はロールバックされます (call2( の外部例外のため)。 ))、これはそれ自体の宣言と矛盾しませんか?
ありがとうヤン