1

エンティティ マネージャを使用するときに、トランザクションに自動的に参加する XAResource を取得する方法を知っていますか?

Bitronix、JPA、休止状態を使用しており、コードは正常に動作しますが、特定の 1 つが失敗した場合にすべての XAResources をロールバックしたくありません。現在のトランザクションからリストを削除したいだけで、他のトランザクションはコミットされます。

しかし、現在のトランザクションのリストから削除するには、オブジェクト XaResource が必要ですが、JPA/Bitronix でそれを取得する方法がわかりません。コードの例:

transactionManager.begin();
try {
    (...)
    EntityManager em = emf.createEntityManager();
    (...)
    em.close();
} catch (Exception e) {
    // old version - rollback every XaResource in the current transaction
    //transactionManager.rollback();
    //new version wanted - rollbackonly this XaResource    
    transactionManager.getTransaction().delistResource(XaResource ...);
    throw e;
}
transactionManager.commit();

ご協力いただきありがとうございます。

4

1 に答える 1

1

ACIDのA (tomicity) プロパティでは、このようなシナリオは許可されません。トランザクションは、すべてのデータ ソースがコミットできた場合にのみ成功します。

Command Patternが問題の解決に役立つと思います。2 つのデータ ソースを更新する必要があり、1 つが失敗した場合でも、既に実行されたコマンドを元に戻すかどうかを制御できるとします。

取り消したくない場合は、XA トランザクションは必要ありません。Resource Local トランザクションを使用するだけで、1 つのデータ ソースに障害が発生した場合でも、残りは処理を続行できます。

于 2014-05-15T11:43:42.113 に答える