【问题标题】:Does Hibernate support nested transactions?Hibernate 是否支持嵌套事务?
【发布时间】:2015-10-16 22:37:20
【问题描述】:

如果我有这个:

Start transaction1
  Call someMethod
    Start transaction2
       Call someOtherMethod
          Start tranaction3

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

谢谢!

【问题讨论】:

    标签: hibernate transactions


    【解决方案1】:

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

    在创建SessionFactory 时,在程序开始处创建一个Connection。此时,您还创建了一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多