保存由其他会话删除的实体时的StaleStateException(并发)

时间:2013-03-15 08:19:11

标签: nhibernate concurrency

我正在使用NHibernate来访问数据层。 我在内存中有一个实体以前加载,并且我进行了更改以便在数据库之后保存。当我的应用程序同时在某些机器上运行时,问题出现了,而其他用户已经从数据库中删除了我在内存中我想要保存的同一个对象。当我尝试保存更改或删除此实体时,触发了StaleStateException。

我检查一个实体是否存在于这种方式调用session.Get<T>的数据库中(成功获得null):

using (var session = NHibernateSessionHelper.OpenSession())
{
   using (var transaction = session.BeginTransaction())
   {
       var entity = session.Get<T>(persistObject.Id);
       return entity == null ? false : true;
   }
}

当我无法区分实体何时被其他会话/用户删除(因此我的内存中的实体已过时)或者该实体最近已创建并且能够保存时,问题就出现了。 我认为唯一的解决方案是实现一种机制来检查实体是否已经从数据库中保存或加载,以便在继续时丢弃实体或保存。

有没有办法通过使用nhibernate来检查这种行为?我尝试session.Refresh() and session.Get<T>,但我仍然不知道该对象是否是新的并准备好保存或过时。

非常感谢。

1 个答案:

答案 0 :(得分:1)

你所拥有的是一个典型的错误处理方法。因为用户已经决定删除​​数据库中的对象而另一个用户想要保存对同一对象的更改,所以您无法说出正确的状态应该是什么。用户是应该如何处理情况的人。您可以通过给他一些选择来使您的错误处理变得更加智能。对于有多个用户写入同一对象的情况,您还应该实现像乐观锁定这样的机制,以防止其他用户覆盖他没有看到的更改。如果您有很多这种情况,您应该考虑重新设计数据库/对象结构,以便一次编辑更少的数据,或者重新考虑用户对系统执行的工作/流程。

相关问题