其他分享
首页 > 其他分享> > Spring的PlatformTransactionManager是否要求以特定顺序提交事务?

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

作者:互联网

我希望通过使用Spring的PlatformTransactionManager对现有的交易API进行改造,以使Spring可以管理我们的交易.我将数据源链接如下:

DataSourceTransactionManager-> LazyConnectionDataSourceProxy-> dbcp.PoolingDataSource-> Oracle数据源

在试用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完全不合适,该API允许您创建以Java对象表示的事务并以任何顺序提交.

我的问题:
我是否认为这种LIFO行为对Spring的交易管理至关重要(即使对于完全独立的交易也是如此)?还是有一种方法可以调整其行为以使上述测试通过?

我知道正确的方法是使用批注,AOP等,但是目前我们的代码不是Spring托管的,因此对于我们来说这并不是一个选择.

谢谢!

解决方法:

是的,使用spring时遇到了以下相同问题:
java.lang.IllegalStateException:无法取消激活事务同步-无效.

如上所述,Spring的事务管理要求以LIFO方式(堆栈行为)提交/回滚事务.问题消失了.

谢谢.

标签:spring-transactions,spring
来源: https://codeday.me/bug/20191102/1989470.html