2011-12-08 55 views
1

我目前有一個程序,它有兩個數據源。每個數據源都綁定到一個事務管理器。AbstractRoutingDataSource&Transactional Manager

<bean id="tM" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
<property name="dataSource" ref="ds1" /> 
</bean> 

<bean id="tM2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
<property name="dataSource" ref="ds2" /> 
</bean> 

如果我有訪問既數據源和發生錯誤時,如果一個數據源回滾將所述第二數據源也將回滾功能?

謝謝!

+0

只要不提交,除非兩個數據庫上的事務都完成。 – ziggy

回答

1

如果你的函數訪問數據存儲sequentialy(我的意思是讓提交到第一數據庫和嘗試提交到第二個),那麼如果錯誤發生後第一次提交,第二個數據源會做ROLLBACK,但首先 - 保持COMMITED

所以,你必須使用一個數據存儲或JTATransactionManager。

1

Spring無法回滾提交的JDBC語句。這是XADataSources和2階段提交(通常通過JTA TX管理器)。

您在詢問數據不一致性,試圖自己管理它,因爲這可能會或可能不會工作,具體取決於何時失敗。例如,假定這種流動:

  • 開始TX
  • 做與DS1工作
  • 做與DS2工作
  • 結束TX
    • 提交DS2
    • 提交DS1

如果ds1上的提交失敗,則ds2將保持提交狀態。但是,如果ds2上的提交失敗,那麼整個tx將失敗,ds1將回滾。

此外,你確定你總是關閉數據源的順序是他們打開(第一次使用)?春天可能會照顧這一點,但我不確定。

0

默認情況下,Autocommit可能處於打開狀態。考慮設置它並自己管理提交。