Hibernate支持嵌套事务吗?

11

如果我有这个:

Start transaction1
  Call someMethod
    Start transaction2
       Call someOtherMethod
          Start tranaction3
如果transaction3回滚,transaction2和transaction1也会回滚吗?
谢谢!
1个回答

7

虽然Hibernate不明确支持嵌套事务,但使用能够创建保存点的JDBC 3.0驱动程序可以实现这一点。

在程序开始时创建一个Connection对象,并在此时创建一个Savepoint,它作为事务的起始点。

然后您可以遍历每个嵌套事务。对于每个嵌套事务,应创建另一个不同的savePoint,即rollingSavePoint,如果该嵌套事务失败,则可以回滚到该点。然后,针对该嵌套事务,打开一个使用您在开始时创建的Connection的session(即Session nestedTransaction = SessionFactory.openSession(connection)),并进行更新。刷新会话并关闭它。

完成所有嵌套事务后,调用connection.commit()来提交全局事务并关闭它。像往常一样关闭sessionFactory,然后继续做其他需要做的事情。

注意以下几点:

  • 显然autoCommit模式必须关闭,否则每次调用flush都会直接提交到数据库。
  • 如果您还要进行搜索或其他操作,您需要打开使用自己连接的其他会话。确保将事务隔离级别设置为READ_UNCOMMITED,否则您可能会面临锁定问题。
  • 当然,您应该定期提交,否则您的数据库将出现问题,或者您可以增加数据库虚拟内存的大小。

如果您正在使用Spring,则还可以使用Spring Propagation。请查看此链接http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接