Hibernate 是否支持嵌套事务?
Does Hibernate support nested transactions?
如果我有这个:
Start transaction1
Call someMethod
Start transaction2
Call someOtherMethod
Start tranaction3
如果transaction3回滚,transaction2和transaction1是否也回滚?
谢谢!
虽然 Hibernate 没有明确支持嵌套事务,但使用能够创建 保存点 的 JDBC 3.0 驱动程序可以实现这一点。
创建SessionFactory
时在程序开始处创建一个Connection
。此时您还创建了一个 Savepoint
作为事务的起点。
然后您遍历每个嵌套事务。对于每个嵌套事务,您应该创建另一个不同的保存点,即 rollingSavePoint,如果嵌套事务失败,您可以回滚到该保存点。然后,对于相同的嵌套事务,打开一个使用您在开始时创建的 Connection
(i.e. Session nestedTransaction = SessionFactory.openSession(connection))
的会话并进行更新。刷新会话并关闭它。
所有嵌套事务完成后,调用connection.commit()
提交全局事务并关闭。照常关闭 sessionFactory 并继续执行您需要执行的任何其他操作。
一些注意事项:
- 显然必须关闭自动提交模式,否则每次调用 flush 时都会直接提交到数据库。
- 如果您还进行搜索或其他操作,则需要打开其他使用自己连接的会话。确保将事务隔离级别设置为
READ_UNCOMMITED
,否则您可能会遇到锁定问题。
- 当然你应该定期提交,否则你的数据库会有问题,或者你可以增加数据库虚拟内存的大小。
如果你正在使用 spring 你也可以使用 Spring Propagation.Check 这个 link
http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial
如果我有这个:
Start transaction1
Call someMethod
Start transaction2
Call someOtherMethod
Start tranaction3
如果transaction3回滚,transaction2和transaction1是否也回滚?
谢谢!
虽然 Hibernate 没有明确支持嵌套事务,但使用能够创建 保存点 的 JDBC 3.0 驱动程序可以实现这一点。
创建SessionFactory
时在程序开始处创建一个Connection
。此时您还创建了一个 Savepoint
作为事务的起点。
然后您遍历每个嵌套事务。对于每个嵌套事务,您应该创建另一个不同的保存点,即 rollingSavePoint,如果嵌套事务失败,您可以回滚到该保存点。然后,对于相同的嵌套事务,打开一个使用您在开始时创建的 Connection
(i.e. Session nestedTransaction = SessionFactory.openSession(connection))
的会话并进行更新。刷新会话并关闭它。
所有嵌套事务完成后,调用connection.commit()
提交全局事务并关闭。照常关闭 sessionFactory 并继续执行您需要执行的任何其他操作。
一些注意事项:
- 显然必须关闭自动提交模式,否则每次调用 flush 时都会直接提交到数据库。
- 如果您还进行搜索或其他操作,则需要打开其他使用自己连接的会话。确保将事务隔离级别设置为
READ_UNCOMMITED
,否则您可能会遇到锁定问题。 - 当然你应该定期提交,否则你的数据库会有问题,或者你可以增加数据库虚拟内存的大小。
如果你正在使用 spring 你也可以使用 Spring Propagation.Check 这个 link http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial