我有一个方法如下:
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时暂停。我觉得这里很困惑。
任何人都可以帮我解决这个问题吗?提前谢谢。
答案 0 :(得分:28)
不,methodB()
不会在与methodA()
相同的交易中执行。 Spring的@Transactional
仅适用于单个线程 - 当线程首次使用@Transactional
(或带有@Transactional
的类中的方法)进入方法时,它会创建一个会话,然后在它离开了那个方法。
在您的示例中,事务将在您在线程池中计划作业后结束。 methodB()
将拥有自己的交易。