Можно ли настроить параллельные транзакции в 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();
}
Другие вопросы по тегам