2012-05-02 82 views
29

Spring的事务我有如下的方法:如何使用多线程

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不会提交,因为之前提交的事务。

我可以在methodB中使用@Transactional(propagation = Propagation.REQUIRES_NEW)。这可以让methodB有一个新的事务。但根据spring doc的说法,methodA的调用会在调用methodB时挂起。我觉得这里很混乱。

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

+0

你究竟想要做什么? –

回答

23

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

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

+0

你可以建议如何监控他们是不是同一个交易?我发现的是,交易不是提交。 – Jacky

+0

@Jacky这两个交易中哪个没有提交? – jmruc

+0

methodB的交易不提交。 – Jacky