C# 多线程中SaveOrUpdate上的NHibernate TransientObject异常

C# 多线程中SaveOrUpdate上的NHibernate TransientObject异常,c#,.net,multithreading,nhibernate,C#,.net,Multithreading,Nhibernate,我的应用程序通过套接字连接接收频繁的远程事件,每次启动一个新线程,随后的操作通常会触发相同的对象图,每次保存一个锁定的静态会话。但在执行保存时,有时会收到新的更新,这些更新将向同一对象图添加新元素。我认为这是例外的原因: TransientObjectException object references an unsaved transient instance - save the transient instance before flushing. 如果这是原因,这是可以理解的。

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

TransientObjectException
object references an unsaved transient instance - 
save the transient instance before flushing.  
如果这是原因,这是可以理解的。但是我如何防止这种异常呢?若让事务回滚,则会出现后续异常,如StaleStateObject,然后是UnuniqueObjectException


那么,如何处理或防止这种情况呢

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

  • Save()
    手动保存新创建的引用对象
  • 为关系设置适当的
    cascade
    设置,这样上面的事情就会自动发生(我个人更喜欢这样)

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

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

  • Save()
    手动保存新创建的引用对象
  • 为关系设置适当的
    cascade
    设置,这样上面的事情就会自动发生(我个人更喜欢这样)

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

如果此异常是由于在SaveOrUpdate期间(在不同的线程中)在集合上迭代时修改了实体集合,则很可能是原因。因此,我认为必须设置锁以避免这些并发操作。

如果此异常是因为在SaveOrUpdate期间(在不同的线程中)在迭代集合时修改了实体集合,则可能会导致此异常。因此,我认为必须设置锁以避免这些并发操作。

请检查此项,看起来您有映射问题请检查此项,看起来您有映射问题您是否认为我的假设是错误的?我的想法是,可能有一个线程正在向对象图添加对象,而另一个线程已经在执行SaveOrUpdate。这不会产生TransientObject异常吗?然后我不是会100%被迫做回滚吗?我相信我的级联是可以的,我只使用Cascade.SaveOrUpdate或.Cascade.All-on-All有很多关系。如果这是一种可能性,那么您没有正确同步访问。我必须看更多你的代码,但是在线程之间共享会话几乎从来都不是一个好主意。你能详细解释一下“同步访问”是什么意思吗?如果我有一个线程可能会将元素添加到另一个线程可能正在持久化的对象图中,那么我是否需要获取实体更新和持久化的锁?是的,我理解,但我有不同线程/会话保存的相同实体图实例。从我现在的理解来看;这需要对持久性以及添加实体元素(到图中的集合)进行共享锁定。。对吗?会话不是线程安全的,句号。如果两个线程同时在会话上执行任务,那么不管它们在做什么,都会出现问题。从我在你其他问题中看到的情况来看,你目前的方法不适合你试图解决的问题。那么你认为我的假设是错误的吗?我的想法是,可能有一个线程正在向对象图添加对象,而另一个线程已经在执行SaveOrUpdate。这不会产生TransientObject异常吗?然后我不是会100%被迫做回滚吗?我相信我的级联是可以的,我只使用Cascade.SaveOrUpdate或.Cascade.All-on-All有很多关系。如果这是一种可能性,那么您没有正确同步访问。我必须看更多你的代码,但是在线程之间共享会话几乎从来都不是一个好主意。你能详细解释一下“同步访问”是什么意思吗?如果我有一个线程可能会将元素添加到另一个线程可能正在持久化的对象图中,那么我是否需要获取实体更新和持久化的锁?是的,我理解,但我有不同线程/会话保存的相同实体图实例。从我现在的理解来看;这需要对持久性以及添加实体元素(到图中的集合)进行共享锁定。。对吗?会话不是线程安全的,句号。如果两个线程同时在会话上执行任务,那么不管它们在做什么,都会出现问题。从我在你其他问题中看到的情况来看,你目前的方法并不适合你试图解决的问题。