Можно ли настроить параллельные транзакции в JTA (Atomikos)
У меня есть два транзакционных ресурса, база данных и очередь сообщений. Поэтому я использую Atomikos в качестве менеджера транзакций XA.
Возможно ли внутри транзакции (tx1) открыть другую отдельную транзакцию (tx2) параллельно?
В tx2, он будет фиксировать некоторые данные в db, даже tx1 может быть сбой и в конечном итоге откат.
И tx2 должно быть выполнено внутри tx1, как если бы ошибка произошла в tx2, это также должно откатить tx1.
Кто-нибудь знает, как мне этого добиться?
Спасибо.
1 ответ
Да, вы можете достичь этого. Вы говорите о так называемой "вложенной" транзакции. Прежде всего, для Atomikis необходимо указать свойство com.atomikos.icatch.serial_jta_transactions=false
Если вы работаете с TransactionManager напрямую, вы должны приостановить tx1 до начала tx2 (TransactionManager.suspend()). После совершения транзакции tx2 вы должны возобновить tx1. И если при выполнении tx2 возникает ошибка, вы должны выполнить откат tx2, возобновить tx1 и откат tx1:
пример
TransactionManager tm=...
tm.begin();
Transaction tx1 = tm.getTransaction();
//do somethins in tx1;
tm.suspend(tx1);
tm.begin();
Transaction tx2 = tm.getTransaction();
try{
//do something in tx2
tm.commit() ;// try to commit tx2
}cath(Throwable e){
tx2.rollback();
tm.resume(tx1)
tx1.rollback();
tx1 = null;
}
if(tx1!=null){
tm.resume(tx1);
tm.commit();
}