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