.net 多个同时保存会导致WCF/NHibernate“;由另一个事务更新的行";

.net 多个同时保存会导致WCF/NHibernate“;由另一个事务更新的行";,.net,wcf,nhibernate,.net,Wcf,Nhibernate,我正在开发一个大型应用程序,该应用程序使用大量数据管理复杂的“事件” 该应用程序分为一个客户端(主要是.NET 2.0)、一个基于WCF的服务器(在IIS上运行)(此层的web服务)和一个基于NHibernate的数据后端(带有MS SQL server数据库后端) 我们在以下场景中遇到错误: 多个用户(在我们的测试中是6个)同时在客户机上保存一个持久化对象(如事件)。(这是通过口头倒计时完成的,因此我们讨论的是由于反应时间而产生的秒左右的差异) 当他们在客户机上保存对象时,客户机调用服务器来保

我正在开发一个大型应用程序,该应用程序使用大量数据管理复杂的“事件”

该应用程序分为一个客户端(主要是.NET 2.0)、一个基于WCF的服务器(在IIS上运行)(此层的web服务)和一个基于NHibernate的数据后端(带有MS SQL server数据库后端)

我们在以下场景中遇到错误:

多个用户(在我们的测试中是6个)同时在客户机上保存一个持久化对象(如事件)。(这是通过口头倒计时完成的,因此我们讨论的是由于反应时间而产生的秒左右的差异)

当他们在客户机上保存对象时,客户机调用服务器来保存该对象。服务器执行所需的任何业务逻辑,然后通过NHibernate提交更改

在这种情况下(通过服务调用多次保存),一些客户端将返回一个未经处理的异常:

“行已被其他事务更新或删除”

这是NHibernate的一个例外

在我的研究中,我发现了一些这种错误的例子,但它总是循序渐进的。我们的应用程序按顺序运行良好,这仅在同时保存时发生

如何保护多个同时进行的NHibernate事务不受彼此影响

(这将是一个高容量的应用程序,因此只需最少的锁定就可以了。我们一般无法锁定所有存储。)

是否有NHibernate设置可以执行此操作?我们需要先找出一些服务器代码端锁定吗?数据库是否可以使用不同的事务保护设置来处理此问题

这是一个需要测试的问题,就像大多数线程问题一样,因此采用了研究/理论方法。这样的架构有什么样的体验

编辑:进一步的信息和理论

似乎更改表中直接作为主实体的值不会导致此问题,而更改通过连接访问的元素则会导致此问题。(在本例中是一组属性)

我们似乎适合这种情况的工作理论如下:

同一事件有多个保存。每个人都会获得一个现有事件的副本(要修改)。第一个要保存的就可以了。但是,后面的更新会进行更新,例如添加或删除属性(这是一个联接表),并发现需要完成的添加或删除操作已经完成,并且由于另一个事务编辑了该事件而退出


我们应该如何使这些事件保持同步?

我对单用户多线程应用程序也有同样的问题。关键是用[ThreadSafe]修饰我的会话变量。奇怪的是,我所看到的各种会话管理器似乎都没有做到这一点,而且它们认为它们是自动线程安全的。。。我的经验不是这样的


我接受了上述答案,因为这或多或少是我们的路线。我想进一步阐述。我们的应用程序打算大量使用,因此完全锁定“更新主要实体”过程是个坏主意

我们最终使用的是C#互斥锁,该互斥锁使用“独一无二的东西”进行锁定,在本例中是一个事件ID。这意味着在同一复杂实体上的任何操作都将被锁定,并在这个意义上成为“原子”操作。这解决了我们的问题。我们或多或少地(通过现有的实用程序类)将每个“破坏性”服务操作包装在互斥对象中