Hibernate是否支持嵌套事务?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate是否支持嵌套事务?相关的知识,希望对你有一定的参考价值。

如果我有这个:

Start transaction1
  Call someMethod
    Start transaction2
       Call someOtherMethod
          Start tranaction3

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

谢谢!

答案

虽然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

以上是关于Hibernate是否支持嵌套事务?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate org.hibernate.TransactionException:jaxrs 不支持嵌套事务

Hibernate 4.1.9(最新的最终版本)报告“不支持嵌套事务”

Hibernate + Jersey + Jackson 随机获得“org.hibernate.TransactionException:不支持嵌套事务”

Spring Hibernate:Generic Dao 添加原因 - org.hibernate.TransactionException:不支持嵌套事务

无法提交 Hibernate 事务;嵌套异常是 org.hibernate.Transaction 异常:JDBC 提交失败

无法为事务打开 Hibernate Session;嵌套异常是 org.hibernate.exception.JDBCConnectionException:无法打开连接