3

我正在寻找改造我们现有的事务 API 以使用 Spring 的PlatformTransactionManager,这样 Spring 将管理我们的事务。我将我DataSource的 s 链接如下:

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

谢谢!

4

2 回答 2

3

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

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

谢谢。

于 2012-12-28T03:30:06.887 回答
1

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

于 2012-05-23T14:37:57.903 回答