我正在尝试使用 bitronix 事务管理器启用分布式事务。配置细节包括
- 使用 OCI JDBC 驱动程序和 oracle.jdbc.xa.client.OracleXADataSource。此数据源由 UCP 连接池数据源环绕 - oracle.ucp.jdbc.PoolDataSourceImpl
- 使用 spring JdbcTemplate 执行查询。
- 使用 Bitronix 事务管理器处理分布式事务
- 使用注解的 Spring 声明式事务
我面临的问题是使用 JDBCTemplate 执行的查询没有在事务中执行。我的测试用例使用 JDBCTemplate 执行两个查询,并且当方法在查询执行后引发运行时异常时,它们不会回滚。我还可以看到连接的自动提交状态设置为 true。
<tx:annotation-driven transaction-manager="distributedTransactionManager"/>
<bean id="distributedTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="bitronixTransactionManager"/>
<property name="userTransaction" ref="bitronixTransactionManager"/>
<property name="allowCustomIsolationLevels" value="true"/>
</bean>
<bean id="bitronixTransactionManager" factory-method="getTransactionManager"
class="bitronix.tm.TransactionManagerServices" depends-on="bitronixConfiguration"
destroy-method="shutdown">
</bean>
The data source is created as follows
PoolDataSourceImpl pds = new PoolDataSourceImpl();
try {
pds.setConnectionPoolName(dataSourceName);
pds.setConnectionFactoryClassName("oracle.jdbc.xa.client.OracleXADataSource");
pds.setConnectionFactoryProperties(getOracleDataSourceProperties());
pds.setDataSourceName(dataSourceName);
pds.setServerName("v-in-sd-tst-12");
pds.setPortNumber(1521);
pds.setUser("ForTestCasesAmit");
pds.setPassword("adept");
pds.setMinPoolSize(10);
pds.setMaxPoolSize(100);
pds.setMaxIdleTime(1800);
pds.startPool();
} catch (SQLException e) {
throw new RuntimeException("Cannot create project datasource " + dataSourceName, e);
}
return pds;
关于查询未在事务中执行的原因的任何建议?
更新 1
添加使用 jdbcTemplate 执行查询并在最后引发异常的方法
@Transactional(propagation = Propagation.REQUIRED)
public void execute() {
System.out.println("Starting with the service method");
jdbcTemplateForDSOne.update("UPDATE T1 SET COL1 = 'Date1' WHERE COL2 = 1");
jdbcTemplateForDSOne.update("UPDATE T1 SET COL1 = 'Start Date1' WHERE COL2 = 2");
waitForUserInput();
throw new RuntimeException("Rollback Now");
}
更新 2
“在 Oracle Database 10g 之前的所有版本中,从 XAConnection 获得的连接的默认自动提交状态为 false。从 Oracle Database 10g 开始,默认状态为 true。”
我正在使用 Oracle 11g r2。知道在使用分布式事务将自动提交状态设置为 false 时应该进行哪些配置更改?
更新 3
如果我使用 bitronix 池数据源而不是 oracle ucp PoolDataSource,则这些事务有效。使用 bitronix PoolingDataSource 使 bitronix 有机会将自动提交状态设置为 false。将进行更多调查以找出两者之间的区别。