1

您知道当我使用实体管理器时如何获得自动登记到我的事务中的 XAResource 吗?

我使用 Bitronix、JPA、hibernate,我的代码工作正常,但如果一个特定的失败,我不想回滚我的所有 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) 属性不允许这种情况。只有所有数据源都能够提交,事务才能成功。

我认为命令模式可以帮助您解决问题。假设您要更新两个数据源,如果其中一个失败,您仍然可以控制是否撤消已执行的命令。

如果您从不想撤消,那么您不需要 XA 事务。您只需要使用资源本地事务,如果一个数据源出现故障,其余的可以继续。

于 2014-05-15T11:43:42.113 回答