Hibernate是否支持嵌套事务?

问题描述 投票:2回答:1

如果我有这个:

Start transaction1
  Call someMethod
    Start transaction2
       Call someOtherMethod
          Start tranaction3

如果transaction3回滚,那么transaction2和transaction1也会回滚吗?

谢谢!

hibernate transactions
1个回答
1
投票

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

创建Connection时,在程序开头创建一个SessionFactory。此时,您还可以创建一个Savepoint作为交易的起点。

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

完成所有嵌套事务后,调用connection.commit()提交全局事务并关闭它。按照惯例关闭sessionFactory并继续执行您需要执行的任何操作。

有些事情需要注意:

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

如果你使用的是spring,你也可以使用Spring Propagation。查看这个链接http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial

© www.soinside.com 2019 - 2024. All rights reserved.