我正在使用nhibernate处理一个系统,我在异常catch块中看到了以下两行:
session.Flush();
session.RollbackTransaction();
我对此逻辑非常困惑,看起来不必要的工作来刷新更改,然后使用事务回滚实践。
我想设置一个参数来删除这些刷新调用并仅依赖RollbackTransaction方法,但我遇到了这个question。接下来,我将阅读更多链接的文档,并阅读以下信息块:
如果您回滚事务,则应立即关闭并放弃当前会话以确保NHibernate的内部状态一致。
这是什么意思?我们目前将会话生命周期与我们的Web请求的开始和结束操作配对,所以我担心我们调用flush THEN回滚的原因是让会话保持有效状态。
有什么想法吗?
答案 0 :(得分:3)
NHibernate通过会话进行对象跟踪,并且您执行实体的所有更改都存储在那里,当您执行刷新时,这些更改将写入数据库。如果在执行此操作时遇到异常,则会话状态与数据库状态不一致,因此如果在此阶段执行回滚,它将回滚db transaction但会话值将不会回滚。
根据设计一旦发生,会话不应以可靠的方式进一步使用(即使Session.Clear()也无济于事)
如果您按请求使用会话,并且如果出现错误,最好的方法是向用户显示错误并要求重试该操作。其他选项是创建一个全新的会话,并将其用于数据提取以显示错误。
答案 1 :(得分:0)
Flush
之前的Rollback
很可能是解决因回滚后重新使用会话而导致的应用程序错误的一种技巧。
正如您自己发现的那样,回滚后不得使用该会话。应用程序正在根据您的comment执行该错误。
如果Flush
之前没有Rollback
,会话仍会将更改视为待处理,并会在下一个Flush
提交,从而失去Rollback
目的。在回滚之前执行Flush
会导致挂起的更改被刷新,然后回滚,从而帮助避免会话在以后刷新它们。
但是会话仍然没有处于一致状态,因此通过继续使用它,应用程序将面临风险。会话高速缓存仍保留随后尝试回滚的更改。会话不再将它们视为等待刷新的挂起更改。如果应用程序稍后使用会话访问这些实体,则它们的状态仍然是来自回滚事务的修改后的状态,尽管它们不会被视为脏。