Spring的PlatformTransactionManager是否要求以特定顺序提交事务?

时间:2011-09-21 12:40:29

标签: spring spring-transactions

我希望改进我们现有的事务API以使用Spring的PlatformTransactionManager,以便Spring管理我们的事务。我将我的DataSource链接如下:

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管理的,所以它对我们来说不是一个真正的选择。

谢谢!

2 个答案:

答案 0 :(得分:3)

是的,使用spring时我遇到了同样的问题: java.lang.IllegalStateException:无法停用事务同步 - 未激活。

根据上述内容,Spring的事务管理要求以LIFO方式(堆栈行为)提交/回滚事务。问题消失。

感谢。

答案 1 :(得分:1)

是的,我发现了同样的行为in my own application。一次只有一个事务是“活动的”,当您提交/回滚当前事务时,下一个活动事务是下一个最近启动的事务(LIFO /堆栈行为)。我无法找到任何方法来控制它,它似乎内置于Spring Framework中。