我刚刚开始学习nHibernate而且我对交易感到困惑。我知道nhibernate会跟踪会话中持久对象的所有更改,并且这些更改会在提交时发送到数据库,但这些事务的目的是什么?
如果我将代码包装在'using transaction'块中并调用commit它是否只是提交事务中发生的对象更改,还是提交自上次提交flush以来会话中发生的所有更改?
答案 0 :(得分:2)
事务的目的是确保您不会使用脏数据或错误提交会话。考虑订购书籍的交易的非常简单的情况。
您可能会执行以下操作: a)检查此书是否存在。 b)阅读客户详细信息,看看他的购物车中是否有任何东西。 c)更新书数 d)为订单输入
现在考虑一下在您输入订单时遇到错误的情况,您希望回滚其他更改,即回滚交易时。
你是怎么做到的?那么有很多方法。 Web应用程序的一种方法是监视HTTP Error对象,如下所示:
if(HttpContext.Current != null && HttpContext.Current.Error != null)
transaction.Rollback();
理想情况下,您不应该使用显式事务块来破坏您的工作单元模式。尽量避免这样做
答案 1 :(得分:0)
如果您不使用事务,那么只要NHibernate发送批处理,那么这就是一个事务。我不确定session.Flush()是否使用批处理。我们假设它确实如此。您对session.Flush()的第一次调用将导致事务。假设您的第二次刷新调用导致错误。第一次刷新的更改将保留在DB中。
另一方面,如果您使用显式事务,则可以调用flush一百万次,但如果您回滚事务(可能因为百万次和一次刷新错误),则所有刷新都会回滚。 / p>
希望这是有道理的。