Я пытаюсь включить распределенные транзакции с помощью диспетчера транзакций bitronix.Подробности конфигурации включают
- Использование драйвера JDBC OCI и oracle.jdbc.xa.client.OracleXADataSource.Этот источник данных обернут источником данных пула соединений UCP - oracle.ucp.jdbc.PoolDataSourceImpl
- Использование Spring JdbcTemplate для выполнения запросов.
- Использование Bitronix Transaction Manager для обработки распределенных транзакций
- Весенние декларативные транзакции с использованием аннотаций
Проблема, с которой я сталкиваюсь, заключается в том, что запросы, выполняемые с использованием JDBCTemplate, не выполняютсявыполнено в транзакции.Мой тестовый пример выполняет два запроса, используя JDBCTemplate, и они не откатываются, когда метод генерирует исключение времени выполнения после выполнения запроса.Я также мог видеть, что для состояния автоматической фиксации соединения установлено значение true.
</p>
<pre><code><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>
Источник данных создается следующим образом
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 и выдает исключение в конце
</p>
<pre><code>@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 JDBC упоминает, что
"Статус автоматической фиксации по умолчанию для соединения, полученного из XAConnection, равен false во всех выпусках, предшествующих Oracle Database 10g. Начиная с Oracle Database 10g, статус по умолчанию равен true. "
Я использую Oracle 11g r2.Любая идея, какие изменения конфигурации должны быть сделаны при использовании распределенных транзакций, чтобы иметь статус автоматической фиксации как ложный?
Обновление 3
Транзакции работают, если я использую пул bitronixисточник данных вместо оракула ucp PoolDataSource.Использование bitronix PoolingDataSource дало Bitronix возможность установить для состояния автоматической фиксации значение false.Будем исследовать больше, чтобы понять разницу между ними.