你知道当我使用实体管理器时如何获得自动登记到我的事务中的 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();
感谢您的帮助。
最佳答案
A(tomicity) property of ACID不允许出现这种情况。只有所有数据源都能够提交,事务才能成功。
我认为Command Pattern可以帮助您解决问题。假设您要更新两个数据源,如果其中一个数据源失败,您仍然可以控制是否撤消已执行的命令。
如果您不想撤消,则不需要 XA 事务。您只需使用资源本地事务,如果一个数据源发生故障,其余数据源可以继续进行。
关于java - JTA(Bitronix)/JPA/Hibernate - 如何从 Entitymanager 获取 XAResource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20702714/