如何在多线程中使用Spring事务

48
我有一个以下的方法:
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 = Propagation.REQUIRES_NEW)吗?这可以让方法B拥有一个新的事务。但是根据Spring文档,当调用方法B时,方法A的事务将会暂停。这让我感到非常困惑。

有人能帮我解决这个问题吗?提前感谢您的帮助。


你想让它做什么? - Michael Wiles
1个回答

38
不会,methodB()不会在与methodA()相同的事务中执行。Spring的@Transactional只能在单个线程上工作 - 当一个线程第一次进入带有@Transactional(或带有@Transactional的类中的方法时),它会创建一个会话,然后在离开该方法时提交它。
在您的示例中,事务将在您在线程池中调度作业后结束。 methodB()将拥有自己的事务。

你能否建议如何监测是否为不同的交易?我发现该交易未被提交。 - Jacky
@Jacky 两个事务中哪一个没有提交? - jmruc
方法B的事务未提交。 - Jacky
谢谢 Kiril。我尝试了 @Transactional(propagation = Propagation.REQUIRES_NEW),但它也没有起作用。Spring 本身提供了 Task Executor,但我没有使用它。我只是自己创建了 Executor,不确定是否有关系。我会继续调查。 - Jacky
这是我的错。Kiril,你是正确的。它会为新线程创建一个新的事务。另一个Bug导致了误导我的问题。 - Jacky
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接