是否可以修复在保存/提交休眠会话期间出现的异常?
背景:我们目前正在使用FluentNHibernate更新每个会话数百条记录。每次都会抛出StaleException,因为其中一个记录被其他进程更改了。我看到异常给我带来麻烦的记录的ID,所以理论上,我可以尝试逐出/重新加载对象并再次尝试修改对象,而不是回滚整个hibernate事务。
是否会尝试再次调用Commit,或者由于抛出异常导致会话无效?
答案 0 :(得分:1)
你有例外后,你运气不好。您需要使用新会话重新启动。
如果版本失败很少,乐观锁定就很好。如果没有,你应该让它们变得罕见。您可能有更多用户编辑同一记录:例如,您可以通过在用户打开它进行编辑的时刻设置时间戳来将记录标记为正在编辑。时间戳将设置为now+X minutes
。如果第二个用户来了并且时间戳不在过去,您将向他显示其他人正在编辑的警告。
第二种方法可能是您加载并比较待修改实体的当前版本。如果存在冲突,您将显示用于解决冲突的UI。如果用户决定覆盖其他更改,您可以将其实体上的objectVersion
更新为当前值,然后更新将继续。
您还可以从版本检查中排除某些属性,这样,如果仅更改这些属性,则不会增加版本。例如,我们已将User.lastActivity
字段禁用,因为它会在用户的每个活动中更新,并可能导致不必要的错误。
答案 1 :(得分:0)
似乎我想做的事情是不可能的;如果在刷新到数据库时出现任何异常,则必须使用新会话...
https://ayende.com/blog/3946/nhibernate-mapping-concurrency
摘录:“如果更新失败,因为行已更新,我们将获得StaleObjectException。与所有异常一样,这将使会话不符合使用条件,并且您必须创建一个新会话来处理它。”< / p>
我必须重新设计我的进程来处理指定会话的每一条记录。