asp.net-mvc - 如何用 NHibernate + asp.net mvc 处理这种并发场景?

标签 asp.net-mvc nhibernate concurrency

上下文:用 asp.net MVC + NHibernate 编写的 Web 应用程序。这是一款纸牌游戏,玩家可以同时玩,因此他们的 Action 可能会同时修改实体的同一个字段(他们都在一个字段上执行 x = x + 1)。看起来很经典,但我不知道如何处理它。

不用说,我无法向用户显示“该实体已被其他玩家修改。合并还是取消?”的弹出窗口。当你认为这与某张牌的 Action 有关时,我不能这样干涉。我的应用程序必须在内部处理这种情况。由于字段在实体类中并且每个 session 都有自己的实体实例,所以我不能简单地使用 CLR 锁。这是否意味着我应该使用悲观并发,以便作用于该实体的每个 Web 请求都排队等待玩家完成其操作?实际上意味着每个 PlayCard 请求都应该使用锁?

请不要将有关并发性或类似内容的问题发送给我 NH 文档。我追求的是在这种情况下应该使用的技术,而不是如何在 NH 中实现它。

谢谢

最佳答案

根据您的业务逻辑,尝试二级缓存可能有意义。这可能是一件好事,具体取决于游戏的长度和游戏方式。由于 session 工厂级别存在二级缓存, session 工厂将不得不根据游戏的生命周期进行管理。可以为每个请求创建一个 Nh session ,但是由为二级缓存配置的 session 工厂生成意味着感兴趣的数据在所有 session 中缓存。使用二级缓存的优点是您可以逐个类地配置它——只缓存您需要的实体。它还根据缓存提供程序提供各种并发策略。尽管这可能会将并发问题从数据库级别转移到 NH session ,但这可能会为您提供更好的选择来处理您的情况。使用它有一些陷阱,但它的适用性完全取决于您的业务逻辑。

关于asp.net-mvc - 如何用 NHibernate + asp.net mvc 处理这种并发场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279837/

相关文章:

asp.net - 在 ASP.NET 中更改 session 变量并重新加载页面

java - 在并发 java 应用程序中使用 for 循环迭代器

java - 如何使用一个 WatchService 注册多个文件夹

java - 关于HotSpot中thin-locks实现中锁记录的使用

asp.net-mvc - 发布asp.net mvc项目时编译 View

asp.net-mvc - 部署的 ASP.NET MVC 4 项目无法运行

asp.net-mvc - 读取由同一域中不同主机编写的 cookie(在服务器上)

c# - 基础实体类。 N休眠

NHibernate映射: UserTypes with many-to-one

asp.net - SQL Server 2005 网络 IO 等待时间(ASYNC_NETWORK_IO 等待类型)问题