nhibernate RollbackTransaction以及为什么在回滚后处理会话?

nhibernate RollbackTransaction以及为什么在回滚后处理会话?,nhibernate,transactions,rollback,Nhibernate,Transactions,Rollback,我正在使用nhibernate开发一个系统,我在异常捕获块中看到以下两行代码: session.Flush(); session.RollbackTransaction(); 我对这种逻辑感到非常困惑,而且刷新更改然后使用事务回滚实践似乎是不必要的工作 我想设置一个参数来删除这些flush调用并仅依赖RollbackTransaction方法,但我遇到了这个问题。接下来,我阅读了更多链接的文档,并阅读了以下信息: 如果回滚事务,应立即关闭并放弃当前会话,以确保NHibernate的内部状态一致

我正在使用nhibernate开发一个系统,我在异常捕获块中看到以下两行代码:

session.Flush();
session.RollbackTransaction();
我对这种逻辑感到非常困惑,而且刷新更改然后使用事务回滚实践似乎是不必要的工作

我想设置一个参数来删除这些flush调用并仅依赖RollbackTransaction方法,但我遇到了这个问题。接下来,我阅读了更多链接的文档,并阅读了以下信息:

如果回滚事务,应立即关闭并放弃当前会话,以确保NHibernate的内部状态一致

这是什么意思?目前,我们将会话生存时间与web请求的开始和结束操作配对,因此我担心调用flush-THEN-rollback的原因是为了保持会话处于有效状态


有什么想法吗?

NHibernate通过会话进行对象跟踪,您对实体所做的所有更改都存储在那里,当您进行刷新时,这些更改将写入数据库。如果在执行此操作时出现异常,则会话状态与数据库状态不一致,因此如果在此阶段执行回滚,它将回滚db事务,但不会回滚会话值

根据设计,一旦发生这种情况,会话就不应该以可靠的方式进一步使用(即使session.Clear()也没有帮助)


如果按请求使用会话,并且出现错误,最好的方法是向用户显示错误并要求重试操作。另一种选择是创建一个全新的会话,并将其用于数据获取目的以显示错误。

回滚前刷新
很可能是解决回滚后重新使用会话导致的应用程序错误的一种技巧

正如您自己所发现的,回滚后不得使用会话。应用程序正在按照您的要求执行该错误

没有<代码> FLASH >在<代码>回滚< /代码>之前,会话仍将更改视为未决,并将在下一个代码> FLUSS中提交,从而破坏<代码>回滚目的。在回滚之前执行

Flush
,会导致刷新挂起的更改,然后回滚,从而避免会话稍后刷新这些更改


但是会话仍然处于不一致的状态,因此继续使用它,应用程序将面临风险。会话缓存仍然保存尝试的更改,然后滚动回ED。会话不只是将它们视为等待刷新的等待更改。如果应用程序以后使用会话访问这些实体,它们的状态仍将是回滚事务中修改过的状态,尽管它们不会被认为是脏的。

有一点很清楚:在回滚之前调用flush是多余的。它在代码中的任何地方都被使用,这一事实并没有改变这一事实。而且,正如文档中所述,回滚之后应该立即结束会话。这就是为什么我们在网络中对写和读有特殊的要求。如果写入操作/请求/工作单元的某些部分失败-回滚、返回错误消息、消失会话..那么您是否建议,如果我有其他项目需要记录在数据库中,而不管是否失败,我们应该在相同的回滚逻辑中创建一个新会话?是的,这是您应该做的。太棒了。感谢您帮助澄清使用nhibernate的细微差别!