1

我有一个Games用户可以加入的列表。要选择game,他们必须在该游戏中选择position(即角色)。MVC3/EF4中的并发请求处理

模型

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

的PlayerGame实体定义由玩家所拾取位置。

其他细节

  • 所有的游戏都是一个MVC 3视图中列出。
  • 数据保存在SQL Server 2008实例中,并通过EF4(CodeFirst)访问。
  • 该视图通过一些jQuery Get()调用来更新自己,这些调用可以获取最新的数据,每个数据为N毫秒。
  • 延迟越高(),竞赛条件的机会越大,其中2名用户将尝试选择相同的位置。
  • 我显然需要做一些服务器端验证,以便只有两个用户中的一个能够获得选定的位置,如果他们都在同一时间选择相同的位置。

什么会是驴最好的办法只有1人得到所选择的位置,而另一个得到一个错误的信息?

我目前正在考虑使用TimeStamps来确保只有的2次调用才能成功更新PlayerGame行。这是一个好主意吗?

回答

1

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

+0

的主要问题我与时间戳是看你可能得到我必须在创建游戏的同时创建每个PlayerGame实体。因此PlayerGame.PlayerId必须是可空的。尽管如此,这并不是什么大不了的事情! – 2011-12-13 20:32:16

1

从你的问题我可以假设你也有一个[Positions]表?如果不是,那些来自哪里?

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

然后,如果您收到空值,但它尚未存在,则可以提交它的安全性,如果您确实收到实体,则该位置已被采纳。

注:我不是那熟悉的实体框架语法,只是猜测这将会是个什么样子,但是当我的意思是我的伪代码

+0

是的,有一个Position值,它是PlayerGame的一个属性。你的解决方案的问题在于检查玩家A是否已经获得了位置的检查可以在玩家B尝试更新该行(或者,比如1ms之后)的同时完成。那些比赛条件意味着玩家A不会得到错误信息,但是他的位置会被玩家B偷走,而我显然不希望这样。 – 2011-12-13 20:14:01