44

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

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に新しいトランザクションを持たせることができます。しかし、春のドキュメントによると、methodAのトランザクションはmethodBを呼び出すときに一時停止します。ここはとても混乱しています。

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

4

1 に答える 1

32

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

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

于 2012-05-02T06:47:50.530 に答える