交易如何在nhibernate中工作
本文关键字:工作 nhibernate 交易 | 更新日期: 2023-09-27 17:58:37
我刚开始学习nHibernate,我对事务感到困惑。我知道nhibernate跟踪会话中对持久对象的所有更改,这些更改在提交时发送到数据库,但事务的目的是什么?
如果我将代码包装在"使用事务"块中并调用commit,它是只提交事务中发生的对象更改,还是提交自上次提交flush以来会话中发生的所有更改?
事务的目的是确保您提交的会话中没有脏数据或错误。考虑一个非常简单的交易案例,即订购一本书。
您可能会执行以下操作:a) 现在检查一下这本书是否存在。b) 阅读客户的详细信息,看看他在购物车里有没有什么。c) 更新图书计数d) 输入订单
现在考虑这样一种情况:在输入订单时遇到错误,您希望回滚其他更改,也就是在回滚事务时。
你是怎么做到的?有很多方法。web应用程序的方法之一是监控HTTP错误对象,如下所示:
if(HttpContext.Current != null && HttpContext.Current.Error != null)
transaction.Rollback();
理想情况下,您不应该通过使用显式事务块来破坏您的工作单元模式。尽量避免这样做
如果您不使用事务,那么每当NHibernate发送一个批时,它本身就是一个事务。我不确定会议是否进行。Flush()是否使用批处理。让我们假设是这样。您的第一次通话。Flush()将导致一个事务。假设您对flush的第二次调用导致了一个错误。第一次刷新后的更改将保留在DB中。
另一方面,如果您使用的是显式事务,则可以调用flush一百万次,但如果回滚事务(可能是因为第一百万次flush引发错误),则所有的flush都会回滚。
希望这是有道理的。