【问题标题】:JTA(Bitronix)/JPA/Hibernate - How I can get XAResource from an Entitymanager?JTA(Bitronix)/JPA/Hibernate - 如何从 Entitymanager 获取 XAResource?
【发布时间】:2013-12-20 11:31:44
【问题描述】:

您知道当我使用实体管理器时如何获取自动登记到我的事务中的 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();

感谢您的帮助。

【问题讨论】:

    标签: java hibernate jpa jta bitronix


    【解决方案1】:

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

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

    如果您从不想撤消,则不需要 XA 事务。您只需要使用 Resource Local 事务,如果一个数据源发生故障,其余的可以继续。

    【讨论】:

    • 感谢您的回答,对我有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2012-06-28
    • 2011-11-14
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多