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:无法打开连接