0

是否可以修复在保存/提交休眠会话期间出现的异常?

背景:我们目前正在使用 FluentNHibernate 更新每个会话的数百条记录。时不时地会抛出一个 StaleException,因为其中一条记录已被其他进程更改。我看到异常给了我导致麻烦的记录的 ID,所以理论上,我可以尝试驱逐/重新加载对象并再次尝试修改对象,而不是回滚整个休眠事务。

该工作会尝试第二次调用 Commit,还是会话由于抛出异常而变得无效?

4

2 回答 2

1

出现异常后,您就不走运了。您需要使用新会话重新启动。

如果版本故障很少见,乐观锁定是好的。如果没有,你应该让它们变得稀有。您可能有更多用户在编辑同一条记录:例如,您可以通过在一个用户打开它进行编辑的那一刻设置时间戳来将记录标记为正在编辑。时间戳将设置为now+X minutes。如果第二个用户来了并且时间戳不是过去的,您将向他显示其他人正在编辑的警告。

第二种方法可能是您加载并比较要修改的实体的当前版本。如果存在冲突,您将显示用于解决冲突的 UI。如果用户决定覆盖其他人的更改,您可以objectVersion将他的实体更新为当前值,然后更新将继续。

您还可以从版本检查中排除一些属性,这样如果仅更改这些属性,版本就不会增加。例如,我们为该User.lastActivity字段禁用了它,因为它会在用户的每个活动中更新,并可能导致不必要的错误。

于 2016-04-22T11:46:31.783 回答
0

看来我想做的事情是不可能的;如果在刷新到数据库时发生任何异常,您必须使用新会话...

https://ayende.com/blog/3946/nhibernate-mapping-concurrency

摘录:“如果由于行已更新而导致更新失败,我们将收到 StaleObjectException。与所有异常一样,这将使会话无法使用,您必须创建一个新会话来处理它。”

我将不得不重新设计我的流程,以使用指定的会话处理每条记录。

于 2016-03-17T07:34:30.513 回答