1

メソッドの呼び出しと呼び出しに対して異なる分離レベルを持つネストされたトランザクションの場合、正確にコミットがいつ発生し、正確にロールバックがいつ発生するかを理解したいと思います。

たとえば、2 つのスプリング サービスがあり、service1 の method1 から service2 の method2 を呼び出しています。

以下のプログラムに示すように、Method1 には REQUIRED トランザクション スコープがあり、Method2 には REQUIRES_NEW トランザクション スコープがあります。

Service1 {

 @Transactional(propagation = Propagation.REQUIRED)
method1()
{
    for(int i=0; i<10; i++){
        service2.method2();
    }

    // Some more code which takes some time to process
}

}


Service2 {
 @Transactional(propagation = Propagation.REQUIRES_NEW)
 method2()
 {
    //Save some information to DB
    // Save an object using JPA
 }
}

今私の質問は、私が理解しているように、REQUIRES_NEW は新しいトランザクションを開始しますが、既存の method2 ですぐにコミットしますか、それともメソッド 1 が完了するまでスプリングが待機してからコミットしますか?

どの時点でコミットが発生し、メソッド 2 で保持されている DB の行ロックが解放されるかに興味があります。

注: ここでは、Spring がネストされたトランザクションを実現できるように、両方のメソッドを異なるサービスに配置しました。

前もって感謝します、

バリ

4

1 に答える 1

4

service2 の method2 に入ると、service1 のトランザクション (たとえばtx1) が中断され、新しいトランザクションが service2 に対して作成されます (たとえばtx2)。この新しいトランザクションは前のトランザクションから独立しており、独立してコミットまたはロールバックします。

tx2 は、service2 から戻ったときにコミット/ロールバックし、その後、tx1 は一時停止した時点から再開します。tx2 の結果 (コミットまたはロールバックのいずれか) は、tx1 の動作には影響しません。

Springのドキュメントをお読みください。トランザクションの伝播の詳細については、セクション 16.5.7 を確認してください。

于 2015-10-15T05:24:47.600 に答える