如果我有这个:
Start transaction1
Call someMethod
Start transaction2
Call someOtherMethod
Start tranaction3
如果事务3回滚,那么事务2和事务1也会回滚吗?
谢谢!
答案 0 :(得分:1)
虽然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