JTA(Bitronix)/ JPA / Hibernate - 如何从Entitymanager获取XAResource?

时间:2013-12-20 11:31:44

标签: java hibernate jpa jta bitronix

当我使用我的实体管理器时,你知道我如何能够自动获取XAResource到我的交易中吗?

我使用Bitronix,JPA,hibernate,我的代码运行正常,但如果一个特定的失败,我不想回滚所有的XAResource。我只想将其从当前交易中删除,其他人将被提交。

但是对于当前事务的删除,我需要对象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();

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

A(tomicity) property of ACID不允许这样的情况。只有在所有数据源都能够提交时,事务才能成功。

我认为Command Pattern可以帮助您解决问题。我们假设您要更新两个数据源,如果一个数据源出现故障,您仍然可以控制是否撤消已执行的命令。

如果您永远不想撤消,那么您不需要XA交易。您只需使用资源本地事务,如果一个数据源失败,其余数据源就可以继续。