3

有这样的代码:

ATransaction.commit ();
BTransaction.commit ();

两个事务都使用不同的方案(即它们不同的持久性单元)。有必要将两者结合在一个事务中。因此,如果任何一个事务都无法回滚两者。怎么做?

4

1 回答 1

1

似乎您正在自己管理交易。通常,Java EE 容器会为您处理此类情况。JTA 在这种情况下使用两阶段提交,这正是这种情况。

如果您自己管理交易,那就有点复杂了。问题是,如果您提交第一个并且第二个提交失败,您将无法再回滚第一个。

在你的情况下,我建议如下。通常,提交只能失败,因为如果您修改对象,Hibernate 不会立即将更改写入数据库。当 Hibernate 执行“刷新”时会发生这种情况。这是在执行查询之前自动完成的,这可能会受到您已经修改的对象的影响,并且在事务提交之前也是如此。

因此,您可以先简单地刷新两个实体管理器,这会将所有更改写入两个数据库,然后提交两个事务,这不应该再失败了。

像这样的东西:

entityManager1.flush();
entityManager2.flush();
entityManager1.getTransaction().commit();
entityManager2.getTransaction().commit();

但是,我建议不要手动管理此类情况,而是让容器执行此操作。

于 2012-10-20T08:37:40.190 回答