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

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

methodB 能行得通吗?据我了解,methodB会附加methodA的事务,如果methodA在methodB之前退出怎么办?我猜只有methodA可以被事务提交。但是methodB不会提交,因为之前已经提交了事务。

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

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

最佳答案

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

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

关于java - 如何在多线程中使用spring事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407301/

相关文章:

java - 如何找到线程何时完成?

multithreading - 最快的 x86 汇编代码同步对数组的访问?

c++线程池:用于将函数/lambdas传递给线程的std::function的替代方法?

spring - Spring 数据源和 Tomcat 数据源之间的区别?

spring - tomcat web 应用程序加载分步指南

java - 如何在Spring Web Service中实现计划任务?

java - Spring Security @WithMockUser 不适用于 cucumber 测试

java - 仅从文本字段获取特定信息

Spring <mvc :annotation-driven/> and <mvc:resources can't use together?

java - 带有 Zookeeper 的 Kafka 3.5.7 崩溃 NoSuchMethodError : java. nio.ByteBuffer.flip()