私は以下のような方法があります:
ClassA.Java
@Transactional
public void methodA(){
ExecutorService executorService = Executors.newFixedThreadPool(4);
executorService.execute(new Runnable() {
public void run() {
classB.methodB();
}
});
}
ClassB.Java
@Transactional
public void methodB(){
updateDB();
}
MethodBはうまく機能しますか?私の理解では、methodBはmethodAのトランザクションをアタッチします。methodAがmethodBの前に終了した場合はどうなりますか?トランザクションでコミットできるのはmethodAだけだと思います。ただし、トランザクションは以前にコミットされたため、methodBはコミットしません。
MethodBに@Transactional(propagation = Propagation.REQUIRES_NEW)を使用できますか?これにより、methodBに新しいトランザクションを持たせることができます。しかし、Spring Docによると、methodAのトランスケーションは、methodBを呼び出すと中断します。私はここで非常に混乱しています。
誰もがこの問題について私を助けることができますか?前もって感謝します。
いいえ、methodB()
はmethodA()
と同じトランザクションで実行されません。 Springの_@Transactional
_は単一のスレッドでのみ機能します-スレッドが_@Transactional
_のメソッド(または_@Transactional
_のクラスのメソッド)に最初に入るときにセッションを作成し、次にそれをコミットしますそのメソッドを残します。
この例では、スレッドプールでジョブをスケジュールした後にトランザクションが終了します。 methodB()
には独自のトランザクションがあります。