有这样的代码:
ATransaction.commit ();
BTransaction.commit ();
两个事务都在使用不同的方案(即持久性单元,它们是不同的)。有必要在一个事务中将两者结合起来。因此,如果任何一个事务都无法回滚。怎么做?
答案 0 :(得分:1)
您似乎自己管理交易。通常,Java EE容器会为您处理此类情况。在这种情况下,JTA使用两阶段提交,这恰好适用于这种情况。
如果您自己管理交易,则会更复杂一些。问题是,如果您提交第一个并且第二个提交失败,则无法再回滚第一个。
在你的情况下,我建议以下内容。通常,提交只能失败,因为如果修改对象,Hibernate不会立即将更改写入数据库。当Hibernate执行“刷新”时会发生这种情况。这是在执行查询之前自动完成的,这可能会受到您已修改的对象以及提交事务之前的影响。
因此,您可以先简单地清除两个实体管理器,然后将所有更改写入两个数据库,然后提交两个事务,这不应该再失败。
这样的事情:
entityManager1.flush();
entityManager2.flush();
entityManager1.getTransaction().commit();
entityManager2.getTransaction().commit();
但是我建议不要手动管理这种情况,而是让容器执行此操作。