2011-06-21 174 views
1

我有mybatis 3.0.4和mybatis-spring集成1.0.1部署在Fuse(OSGi)中。我在SQLServer 2008中創建了一個基本數據庫。在Spring中,我配置了一個TransactionAwareDataSourceProxy數據源和一個DataSourceTransactionManager事務管理器。交易沒有回滾

現在我創建了自己的包,用於在Fuse中插入一些行到數據庫中。我已經告訴捆綁使用配置的數據源和事務管理器。執行邏輯的方法如下所示:

@Transactional(propagation=Propagation.REQUIRED) 
public void go(RecsCashContext context) throws ActionException { 

當此方法引發異常時,我可以通過查看觸發的預期行爲來遵循Spring。這導致我彈簧JtaTransactionManagerdoRollBack(..)

所以一切都看起來很有希望,除了當我看着數據庫,當然它處於不穩定的狀態,因爲以前的插入沒有回滾。

我對此感到茫然,我很難在網上找到任何信息。有什麼想法嗎?

回答

1

事實證明Fuse(servicemix)已經通過OSGi服務在包org.apache.aries.transaction.manager_0.2.0.incubating [49]中公開了一個事務管理器。因此,當我查找事務管理器服務時,由捆綁包49暴露的那個服務首先被拾起。

這是通過明確規定的交易經理,我感興趣的是解決目前我使用的是豆名字屬性格式這樣做:

<osgi:reference id="transactionManager" bean-name="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager" /> 

雖然這也可以通過使用過濾器來完成,但最好我們只是利用已經公開的事務管理器服務,而不是提供我們自己的服務。

3

拋出什麼樣的異常?除非您告訴Spring在拋出特定異常時顯式回滾,否則它將繼續。默認情況下,Spring的事務處理只會在引發未經檢查的異常(例如RuntimeException)時回滾。在你的情況,如果你希望回滾時ActionException時發生,你的運氣,除非你做如下修改:

@Transactional(rollbackFor={ActionException.class}) 
public void go(RecsCashContext context) throws ActionException { 

更多細節在here,特別是在第10.5.6.1, @Transactional設置

+0

在這種情況下,我實際上是爲了測試事務性強制運行時異常。正如我所提到的,我能夠通過Spring源代碼看到它聲稱回滾是有效的。 – AndyF

+0

所有的持久性工作都是在go(...)方法中完成的,還是有一些插入是在另一種使用不同傳播規則的方法中完成的? – Fil

+0

所有在同一個......我的擔心是,也許mybatis正在爲它傳播的每個插入創建新的事務 - 雖然我可以看到它爲什麼會這樣做。 – AndyF