我正在寻找改造我们现有的事务 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 管理的,所以它不是我们真正的选择。
谢谢!