2011-09-21 125 views
3

我希望改裝我們現有的交易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管理的,所以它不是我們的選擇。

謝謝!

+0

'PROPAGATION_REQUIRES_NEW'不應該要求事務被提交/回滾,它應該簡單地掛起任何現有的事務並啓動一個新事務。 – skaffman

回答

1

是的,我發現相同的行爲in my own application。一次只有一個事務處於「活動」狀態,並且當您提交/回滾當前事務時,下一個活動事務是下一個最近啓動的事務(LIFO /堆棧行爲)。我無法找到任何方式來控制它,它似乎被嵌入到Spring框架中。

3

是的,我在使用spring時遇到了以下相同的問題: java.lang.IllegalStateException:無法取消激活事務同步 - 未激活。根據以上所述,Spring的事務管理要求事務以LIFO方式(堆棧行爲)提交/回滾。問題消失。

謝謝。

相關問題