多线程中的SaveOrUpdate上的NHibernate TransientObjectException

时间:2012-07-25 17:29:44

标签: c# .net multithreading nhibernate

我的应用程序通过套接字连接接收频繁的远程事件,每个启动一个新线程,后续操作通常会触发每次保存相同的对象图,只有一个锁定的静态会话。但是,当执行该保存时,有时会收到新的更新,这会将新元素添加到同一对象图中。我认为这是例外的原因:

TransientObjectException
object references an unsaved transient instance - 
save the transient instance before flushing.  

如果这是原因,那是可以理解的。但是我如何防止这种异常?如果我让事务回滚,则会发生后续异常,如StaleStateObject,然后是NonUniqueObjectException。

那么如何处理或预防?

2 个答案:

答案 0 :(得分:1)

有两种方法可以防止错误:

  • Save()手动新创建的引用对象
  • 为关系设置适当的cascade设置,因此以上情况自动发生(我个人更喜欢这个)

当然,当您打算引用现有对象时,或者即使使用锁也存在线程问题,您完全有可能创建新对象。

答案 1 :(得分:-1)

可能的原因是,如果此异常是在SaveOrUpdate期间(在不同的线程中)迭代集合时正在修改实体集合。所以我认为必须放置锁以避免这些并发行为。