我有如下方法:

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将不会提交,因为该事务之前已提交。

我可以对方法B使用@Transactional(propagation = Propagation.REQUIRES_NEW)。这可以使methodB进行新的事务。但是根据spring doc,调用methodB时methodA的事务将暂停。我在这里感到很困惑。

谁能帮我解决这个问题?提前致谢。

最佳答案

不,methodB()将不会与methodA()在同一事务中执行。 Spring的@Transactional仅在单个线程上起作用-当线程首先输入带有@Transactional的方法(或带有@Transactional的类中的方法),然后在离开该方法时提交它,它将创建一个 session 。

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

关于java - 如何在多线程中使用Spring事务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10407301/

10-09 07:54