【发布时间】:2017-05-03 02:34:12
【问题描述】:
上下文:用 asp.net MVC + NHibernate 编写的 Web 应用程序。这是一个纸牌游戏,玩家同时进行游戏,因此他们的动作可能会同时修改实体的同一字段(他们都在一个字段上执行 x = x + 1)。看起来很经典,但我不知道如何处理。
不用说,我不能向用户显示“实体已被其他玩家修改。合并或取消?”的弹出窗口。当你认为这与卡牌的动作有关时,我不能这样干涉。我的应用程序必须在内部处理这种情况。由于该字段位于实体类中,并且每个会话都有自己的实体实例,因此我不能简单地使用 CLR 锁。这是否意味着我应该使用悲观并发,以便在该实体上执行的每个 Web 请求都排队,直到玩家完成他的操作?实际上意味着每个 PlayCard 请求都应该使用一个锁?
请不要将我发送给关于并发或类似的 NH 文档。我关注的是在这种情况下应该使用的技术,而不是如何在 NH 中实现它。
谢谢
【问题讨论】:
-
听起来您想要一个系统,其中多个用户都能够修改实体属性(在服务器上),没有任何并发问题 - 即没有锁,但所有更新都成功?这当然是不可能的 - 只有两种可能性 - 要么您锁定并允许一次只进行 1 次更新,要么您允许所有更新成功,但接受最后一次更新将覆盖任何较早的更新。跨度>
-
我的直觉是我必须锁定,不仅是更新,还有“选择+更新”序列。否则我的 x = x + 1 示例将不起作用。我不能接受并发更新,因为初始 x = 1,在所有玩家行动后 x 将是 2 而不是 3。所以我的问题更像是“我说得对吗,比如说 PlayCard 动作,所有的网络请求都应该被会话锁定”?
-
我不会在这里使用数据库。我会让客户端 ajax 调用服务器 - 这将允许更新或阻止它,具体取决于哪个首先进入那里 - 将原始值与当前值进行比较。在服务器端,我会将实体保存在单例中以提高响应速度。
-
谢谢,但不可能。 x+1 只是一个例子,我有很多不能放在客户端的逻辑,只能放在服务器端。
-
谁说客户端?我只是说使用 ajax 来提高速度 - 逻辑仍然是服务器端。
标签: asp.net-mvc nhibernate concurrency