2016-09-13 79 views
0

我想在我的應用程序中使用一個方法的聲明性事務,使得幾個數據庫調用。我這樣做,通過應用@Transactional註釋有問題的方法,該方法類似於這樣:春天 - 交易沒有被應用在方法周圍

@Transactional 
public MyReturnType myTransactionalMethod(SomeType1 param) { 
    SomeType2 someIntermediateObject = dao1.doStuff(param); 
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject); 
    return retObj; 
} 

我再建立Spring的事務中在我的XML配置:

<tx:annotation-driven transaction-manager="transactionManager" order="200"/> 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" 
     p:dataSource-ref="dataSource"/> 

我當時就想以測試方法,以驗證該交易將回滾正確在方法的失敗,讓我修改我的方法看起來是這樣的:

public MyReturnType myTransactionalMethod(SomeType1 param) { 
    SomeType2 someIntermediateObject = dao1.doStuff(param); 
    MyReturnType retObj = dao2.doMoreStuff(someIntermediateObject); 
    throw new RuntimeException(); //The RuntimeException should trigger a rollback 
} 

當我EXECUT編輯這第二種方法,它沒有像我所期望的那樣進行回滾,而是將創建的條目留在了我的數據庫中。我也希望在堆棧跟蹤中看到Spring插件的某些符號插入了我的插入方法,它將處理事務性的東西,但我只在這個事務性方法之前看到調用方法,沒有任何Spring注入方法的跡象。

任何人都可以看到我做錯了什麼,會導致這種行爲在事務處理沒有得到應用?

+3

顯示你在哪裏調用'myTransactionalMethod'。 – chrylis

回答

1

此行爲是因爲您正在使用DataSourceTransactionManager,因此此txManager用於JDBC事務。例如,如果您在數據庫中插入某些內容,並且失敗,它將回滾此事務。如果嘗試插入比允許的值更長的值,tx可能會失敗。注意數據源意識到失敗。

在你的例子中,由於拋出異常,DataSource並不知道失敗。對於這些情況,您可以使用JtaTransactionManager,但您的容器必須支持JTA事務。或者,您可以使數據庫中的失敗嘗試插入某個值太長的值,或者在非空列中插入不同類型的值或空值。

你可以看到更多在這裏:

http://www.journaldev.com/2603/spring-transaction-management-jdbc-example

http://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html