如果我有这个:
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并继续执行您需要执行的任何操作。
有些事情需要注意:
READ_UNCOMMITED
,否则您可能会遇到锁定问题。如果你使用的是spring,你也可以使用Spring Propagation。查看这个链接http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial