0

伝播=必須の @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( の外部例外のため)。 ))、これはそれ自体の宣言と矛盾しませんか?

ありがとうヤン

4

1 に答える 1

0

トランザクションはメソッドの最後でコミットされます。期待どおりにトランザクションを伝播するには、call2() を call1() の本体から呼び出す必要があります。

于 2013-12-24T06:21:49.933 に答える