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