如何在多线程中使用弹簧事务

我有一个如下方法:

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();
}

方法B可以很好地工作吗?根据我的理解,方法B将附加方法A的事务,如果方法A在方法B之前退出怎么办?我想只有方法A可以由事务提交。但是方法 B 不会提交,因为之前提交的事务。

我可以对方法B使用@Transactional(传播= Propagation.REQUIRES_NEW)吗?这可以让方法 B 有一个新的事务。但根据 spring 文档,方法 A 的事务会在调用方法 B 时暂停。我在这里感到非常困惑。

任何人都可以在这个问题上帮助我吗?提前致谢。


答案 1

否,不会在与 执行相同的事务中执行。Spring's 仅适用于单个线程 - 当线程首次输入带有的方法(或带有 )的方法时,它会创建一个会话,然后在离开该方法时提交它。methodB()methodA()@Transactional@Transactional@Transactional

在您的示例中,事务将在您在线程池中计划作业后结束。 将有自己的交易。methodB()


答案 2