【问题标题】:How to use spring transaction in multithread如何在多线程中使用spring事务
【发布时间】:2012-05-11 13:07:23
【问题描述】:

我有一个方法如下:

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时暂停。我在这里感到很困惑。

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

【问题讨论】:

  • 你到底想让它做什么?

标签: java multithreading spring transactional propagation


【解决方案1】:

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

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

【讨论】:

  • 您能否建议如何监控它们是否不是同一个事务?我发现事务没有提交。
  • @Jacky 两个事务中哪一个没有提交?
  • 方法B的事务没有提交。
  • 我真的不知道是什么问题,但一个疯狂的猜测是 ClassB 不是 Spring bean - 请参阅 static.springsource.org/spring/docs/3.1.x/…
  • 它是一个 Spring bean。在我让它在同一个线程中执行后它运行良好,这意味着我删除了 executorService 的使用。
猜你喜欢
  • 2019-02-10
  • 2020-09-11
  • 2016-06-04
  • 2013-05-26
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2021-02-20
  • 2022-01-05
相关资源
最近更新 更多