gpt4 book ai didi

.net - 多个同时保存导致 WCF/NHibernate "Row updated by another transaction"

转载 作者:行者123 更新时间:2023-12-04 00:40:37 30 4
gpt4 key购买 nike

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

该应用程序分为客户端(主要是 C#,主要是 .NET 2.0),一个基于 WCF 的服务器,运行在 IIS 上(该层的 Web 服务),以及一个基于 NHibernate 和 MS SQL Server 的数据后端数据库后端。

我们遇到了以下情况的错误:

多个用户(在本例中为 6 个,在我们的测试中)同时在客户端保存一个持久对象(例如事件)。 (这是通过口头倒计时完成的,所以我们说的是 react 时间造成的一秒左右的差异)

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

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

“行已被另一笔交易更新或删除”

这是一个 NHibernate 异常。

在我的研究中,我发现了这个错误的一些实例,但它总是连续的。我们的应用程序顺序运行良好,这只发生在同时保存的情况下。

多个同时发生的 NHibernate 事务应该如何相互保护?

(这将是一个高容量的应用程序,因此需要最少的锁定是好的。我们通常无法锁定所有保存。)

是否有 NHibernate 设置可以做到这一点?我们是否需要事先弄清楚一些服务器代码端锁定?数据库是否可以使用不同的事务保护设置来处理这个问题?

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

编辑:更多信息和理论。

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

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

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

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

最佳答案

我在一个多线程的单用户应用程序中遇到了同样的问题。关键是用 [ThreadSafe] 装饰我的 session 变量。奇怪的是,我看过的各种 session 管理器似乎都没有这样做,他们认为它们是自动线程安全的……根据我的经验,情况并非如此。

Asp Session Manager

Multi DB Session

关于.net - 多个同时保存导致 WCF/NHibernate "Row updated by another transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521342/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com