上下文:用 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/