2012-05-02 81 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