Hibernate 是否支持嵌套事务?

mst*_*rom 7 hibernate transactions

如果我有这个:

Start transaction1
  Call someMethod
    Start transaction2
       Call someOtherMethod
          Start tranaction3
Run Code Online (Sandbox Code Playgroud)

如果事务 3 回滚,事务 2 和事务 1 也会回滚吗?

谢谢!

Vik*_*ats 7

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

Connection创建时在程序开始处创建SessionFactory。此时,您还创建了一个Savepoint作为事务起点的。

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

所有嵌套事务完成后,调用connection.commit()提交全局事务并关闭。像往常一样关闭 sessionFactory 并继续执行您需要执行的其他操作。

需要注意的一些事项:

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

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