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

方法B能很好地工作吗?据我了解,methodB会附加methodA的事务,如果methodA在methodB之前退出怎么办?我猜只有methodA可以被事务提交。但是methodB不会提交,因为之前已经提交了事务。

我可以将@Transactional(propagation = Propagation.REQUIRES_NEW) 用于方法B。这可以让 methodB 有一个新的事务。但是根据spring doc,methodA的transcation会在调用methodB时暂停。我在这里感到很困惑。

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

4

1 回答 1

32

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

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

于 2012-05-02T06:47:50.530 回答