我有如下方法:
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/