Можно ли настроить параллельные транзакции в JTA (Atomikos) - PullRequest
1 голос
/ 14 октября 2011

У меня есть два транзакционных ресурса, база данных и очередь сообщений.Поэтому я использую Atomikos в качестве диспетчера транзакций XA.

Внутри транзакции (tx1) можно ли открыть другую отдельную транзакцию (tx2) параллельно?

В tx2 он совершит некоторыеданные в БД, даже tx1 может быть сбой и в конечном итоге откат.

И tx2 должно быть сделано внутри tx1, как если бы ошибка произошла в tx2, должен также откатить tx1.как мне этого добиться?

Спасибо.

1 Ответ

1 голос
/ 13 января 2012

Да, вы можете достичь этого. Вы говорите о так называемой «вложенной» транзакции Прежде всего для 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();
}
...