我希望改裝我們現有的交易API以使用Spring的PlatformTransactionManager
,這樣Spring將管理我們的交易。我鏈式我DataSource
S作爲如下:Spring的PlatformTransactionManager是否需要按特定順序提交事務?
DataSourceTransactionManager
- >LazyConnectionDataSourceProxy
- >dbcp.PoolingDataSource
- >OracleDataSource
在與DataSourceTransactionManager
實驗,我發現,在使用PROPAGATION_REQUIRES_NEW,似乎Spring的事務管理要求交易被承諾/回滾到LIFO時尚,即您必須首先提交/回滾最近創建的交易。
例子:
@Test
public void testSpringTxns() {
// start a new txn
TransactionStatus txnAStatus = dataSourceTxnManager.getTransaction(propagationRequiresNewDefinition); // specifies PROPAGATION_REQUIRES_NEW
Connection connectionA = DataSourceUtils.getConnection(dataSourceTxnManager.getDataSource());
// start another new txn
TransactionStatus txnBStatus = dataSourceTxnManager.getTransaction(propagationRequiresNewDefinition);
Connection connectionB = DataSourceUtils.getConnection(dataSourceTxnManager.getDataSource());
assertNotSame(connectionA, connectionB);
try {
//... do stuff using connectionA
//... do other stuff using connectionB
} finally {
dataSourceTxnManager.commit(txnAStatus);
dataSourceTxnManager.commit(txnBStatus); // results in java.lang.IllegalStateException: Cannot deactivate transaction synchronization - not active
}
}
可悲的是,這不符合我們的當前事務API,它允許您創建交易,通過Java對象代表適合在所有的好,以任意順序提交它們。
我的問題: 我認爲這種LIFO行爲對於Spring的事務管理(即使是完全獨立的事務)至關重要嗎?還是有辦法調整其行爲,以便上述測試通過?
我知道正確的方法是使用註釋,AOP等,但目前我們的代碼不是Spring管理的,所以它不是我們的選擇。
謝謝!
'PROPAGATION_REQUIRES_NEW'不應該要求事務被提交/回滾,它應該簡單地掛起任何現有的事務並啓動一個新事務。 – skaffman