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

Jac*_*cky 37 java spring multithreading 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

jmr*_*ruc 29

不,methodB()不会在同一笔交易中执行methodA().Spring @Transactional只能在单个线程上运行 - 当线程首次使用@Transactional(或类中的方法@Transactional)进入某个方法时,它会创建一个会话,然后在它离开该方法时提交它.

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