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

时间:2012-05-02 03:25:27

标签: java multithreading spring transactional propagation

我有一个方法如下:

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能运作良好吗?根据我的理解,methodB将附加methodA的事务,如果methodA在methodB之前退出怎么办?我想只有methodA才能被事务提交。但是因为之前提交的事务,methodB不会提交。

我可以对methodB使用@Transactional(propagation = Propagation.REQUIRES_NEW)。这可以让方法B有一个新的事务。但是根据spring doc,方法A的转换将在调用methodB时暂停。我觉得这里很困惑。

任何人都可以帮我解决这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:28)

不,methodB()不会在与methodA()相同的交易中执行。 Spring的@Transactional仅适用于单个线程 - 当线程首次使用@Transactional(或带有@Transactional的类中的方法)进入方法时,它会创建一个会话,然后在它离开了那个方法。

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