作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个方法如下:
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/
我是一名优秀的程序员,十分优秀!