2013-10-18 52 views
0

我有這樣的情況:嵌套Spring的事務與Hibernate

@Component @Transactional 
public class Test{ 

    public void mainMetod(){ 
     //do some changes on db 

     classA.method1(); 

     classA.method2(); 
    } 

} 

@Component @Transactional 
public class A{ 

     public method1(){ 
      //read some data from db that Test class wrote 
     } 


     public method2(){ 
      //read some data from db that Test class wrote 
     } 
} 

和app-JPA-config.xml中

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> --> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<tx:annotation-driven /> 

我試圖實現這種行爲:

  • 我希望A類的方法1可以看到寫在Test類的主方法中的數據
  • 我想要在方法1中是否存在異常時,僅返回僅由method1()進行的修改而不回滾由Test類的mainMethod進行的修改。 我需要讀取測試類mainMethod寫的更新數據
  • 我想,如果在method2中有一個異常,只有通過method2()進行回滾利益修改,而不是由測試類mainMethod進行的回滾修改。 我需要閱讀mainMethod測試類的寫更新的數據

如果我使用默認的傳播,我到達的第一個請求(可讀取的數據寫到由mainmethod),但我不能達到第二個請求:回滾在方法1/2中回滾整個事務。

如果我使用傳播REQUIRES_NEW,我實現第二個請求,但不是一個。

我認爲唯一的方法是使用TransactionTemplate的手動事務。我的假設是否正確?

回答

0

Hibernate不支持嵌套事務註釋。所以解決我發現的問題的唯一方法是使用TransactionTemplate。

transactionTemplate.execute(new TransactionCallback<Void>() { 

     @Override 
     public Void doInTransaction(TransactionStatus status) { 
} 
}); 

doInTransaction方法中的所有代碼都在事務上下文中執行。所以通過這種方式,我可以手動管理方法提交結果的確切點。

希望這會有幫助