web-dev-qa-db-ja.com

マルチスレッドでSpringトランザクションを使用する方法

私は以下のような方法があります:

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を呼び出すと中断します。私はここで非常に混乱しています。

誰もがこの問題について私を助けることができますか?前もって感謝します。

37
Jacky

いいえ、methodB()methodA()と同じトランザクションで実行されません。 Springの_@Transactional_は単一のスレッドでのみ機能します-スレッドが_@Transactional_のメソッド(または_@Transactional_のクラスのメソッド)に最初に入るときにセッションを作成し、次にそれをコミットしますそのメソッドを残します。

この例では、スレッドプールでジョブをスケジュールした後にトランザクションが終了します。 methodB()には独自のトランザクションがあります。

31
jmruc