メソッドの呼び出しと呼び出しに対して異なる分離レベルを持つネストされたトランザクションの場合、正確にコミットがいつ発生し、正確にロールバックがいつ発生するかを理解したいと思います。
たとえば、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 がネストされたトランザクションを実現できるように、両方のメソッドを異なるサービスに配置しました。
前もって感謝します、
バリ