1

データベースとメッセージ キューの 2 つのトランザクション リソースがあります。そこで、Atomikos を XA トランザクション マネージャーとして使用します。

トランザクション (tx1) 内で、別の分離されたトランザクション (tx2) を並行して開くことは可能ですか?

tx2 では、一部のデータを db にコミットしますが、tx1 が失敗して最終的にロールバックされる可能性があります。

また、tx2 でエラーが発生した場合は tx1 もロールバックする必要があるため、tx2 は tx1 内で実行する必要があります。

どうすればこれを達成できるか知っている人はいますか?

ありがとうございました。

4

1 に答える 1

1

はい、これを達成できます。「ネストされた」トランザクションという名前について話します。まず、Atomikis の場合、プロパティcom.atomikos.icatch.serial_jta_transactions=falseを指定する必要があります。

TransactionManager を直接操作する場合は、tx2 を開始する前に tx1 を一時停止する必要があります (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();
}
于 2012-01-13T14:30:12.200 に答える