gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:35:42 26 4
gpt4 key购买 nike

我希望改造我们现有的事务 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 管理的,所以这对我们来说不是一个真正的选择。

谢谢!

最佳答案

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

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

谢谢。

关于spring - Spring 的 PlatformTransactionManager 是否需要以特定顺序提交事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7499893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com