有没有ISession.Merge()的替代方法,在使用乐观锁定时不会抛出?

时间:2011-07-27 14:07:51

标签: nhibernate merge optimistic-locking optimistic-concurrency

我一直在尝试使用ISession.Merge()来保持两个会话之间的一致性,但是当合并实例的版本属性高于会话中加载的版本属性(使用StaleObjectStateException)时,它会失败。

当版本字段不匹配时,是否有其他可行的方法?

2 个答案:

答案 0 :(得分:0)

尝试致电:

Session.Lock(string entityName, object obj, LockMode lockMode);

使用LockMode.Force。该方法的备注说明:

  

这可用于执行版本检查   (NHibernate.LockMode.Read),升级到悲观锁   (NHibernate.LockMode.Upgrade),或简单地重新关联瞬态   具有会话的实例(NHibernate.LockMode.None)。这个操作   如果关联映射,则级联到关联实例   级联= “锁定”。

对于LockMode.Force:

  

与NHibernate.LockMode.Upgrade类似,但对于版本化   实体,它会导致强制版本增量。

答案 1 :(得分:0)

似乎没有任何方法可以在会话之间安全地合并实体,至少是乐观锁定。

我将采用另一种模式:每个会话都有自己的每个实体的副本,并根据需要refresh()每个会话上的实例。{{1}}这增加了内存使用和数据库往返的开销,但似乎有效。