2015-10-16 126 views
2

如果我有这样的:Hibernate是否支持嵌套事务?

Start transaction1 
    Call someMethod 
    Start transaction2 
     Call someOtherMethod 
      Start tranaction3 

如果transaction3回滚,做transaction2和Transaction1将回滚也?

谢谢!

回答

1

尽管Hibernate没有明确支持嵌套事务,但使用能够创建保存点的JDBC 3.0驱动程序可以实现此目的。

创建SessionFactory时在程序开始时创建Connection。此时您还创建了一个作为交易起点的Savepoint

然后您将遍历每个嵌套事务。对于每个嵌套事务,您应该创建另一个不同的savePoint,即一个rollingSavePoint,如果嵌套事务失败,您可以回滚它。然后,对于同一个嵌套事务,请打开一个会话,该会话使用您在开始(i.e. Session nestedTransaction = SessionFactory.openSession(connection))处创建的Connection并进行更新。刷新会话并关闭它。

在所有嵌套事务完成后,请致电connection.commit()提交全局事务并关闭它。按照惯例关闭sessionFactory并继续执行您需要执行的任何操作。

需要注意以下几点:

  • 显然自动提交模式必须关闭,否则每次调用冲洗时间,你会很直接commiting到数据库。
  • 如果您还在进行搜索或其他操作,您需要打开其他使用自己连接的会话。确保将事务隔离级别设置为READ_UNCOMMITED否则您可能会遇到锁定问题。
  • 当然你应该定期提交,否则你的数据库会有问题,或者你可以增加数据库虚拟内存的大小。

如果您使用的春天,您还可以使用Spring Propagation.Check此链接 http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial