Hibernate是否支持嵌套事务?

时间:2015-10-16 22:37:21

标签: hibernate transactions

如果我有这个:

Start transaction1
  Call someMethod
    Start transaction2
       Call someOtherMethod
          Start tranaction3

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

完成所有嵌套事务后,调用connection.commit()提交全局事务并关闭它。按照惯例关闭sessionFactory并继续做你需要做的其他事情。

有些注意事项:

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

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