MVC3 / EF4中的并发请求处理

时间:2011-12-13 19:27:07

标签: asp.net-mvc-3 model-view-controller entity-framework-4 concurrency

我有Games个用户可以加入的列表。要选择game,他们必须在该游戏中选择position(即角色)。

模型

[Game] 1 <-> * [PlayerGame] * <-> 0..1 [Player]

PlayerGame实体定义玩家选择的位置。

其他详情

  • 所有游戏都列在MVC 3视图中。
  • 数据保存在SQL Server 2008实例中,并通过EF4(CodeFirst)进行访问。
  • 视图通过一些jQuery Get()调用自行更新,每次调用都会提取最新数据 N 毫秒。
  • 延迟越高( N ),比赛条件的可能性就越大,其中2个用户会尝试选择相同的位置。
  • 我显然需要做一些服务器端验证,只允许两个用户中的一个获得所选位置,如果他们同时选择相同的位置。

只有一个人获得所选位置而另一个人收到错误消息的最佳方法是什么?

我正在考虑使用TimeStamps来确保只有2个调用中的 1 可以成功更新PlayerGame行。这是个好主意吗?

2 个答案:

答案 0 :(得分:1)

是使用时间戳。这是通常使用的方式,SQL服务器(任何数据库服务器)和EF都支持它们。您必须将时间戳往返客户端并在构造要更新的实体时使用它(在分离方案中)。

答案 1 :(得分:1)

从你的问题我可以假设你还有[Positions]表?如果没有,那些来自哪里?

所以你真的不需要时间戳吗?在您坚持实体之前,请执行entity.List().Where(x => x.GameId == requestedGameId && x.PositionId == requestedPositionId)

之类的操作

然后,如果您收到null并且它不存在,则可以安全地提交,如果您确实收到了实体,则该位置已被占用。

注意:我不熟悉实体框架语法,只是猜测它是什么样的,但是当我的意思是我的伪代码时你可能会得到