2

我正在为网络编写一种策略类多用户游戏。它有一个游戏场(X x Y 方格),我计划将其序列化并存储在 MySQL(innodb)数据库中的 BLOB 中,每个正在进行的游戏一行。

我现在试图找出一个很好的方法来保持数据库随着比赛场地的任何变化而更新,同时找到一个方便的解决方案来处理在加载页面和实际之间的时间范围内比赛场地发生的事情采取行动。
我不使用 AJAX。

每局游戏最多有 20 名玩家,每个玩家在 24 小时内走 1 到 10 步,所以这是一个“慢”游戏。

我的计划(到目前为止)是还为 blob 旁边的 playfield 存储一种校验和,并将数据库状态与在尝试更改 playfield 之前加载的状态进行比较。

我担心的是如何防止竞争条件。
是否足够:

  1. 开始交易。
  2. 从表中加载运动场
  3. 如果校验和不同 - 回滚并更新用户视图
  4. 如果校验和不变 - 更新表并提交更改

是否BEGIN TRANSACTION足以阻止比赛,还是我需要在第 2 步中做更多的事情来表明我更新表格的意图?

感谢所有的建议。

4

2 回答 2

2

如果您在从数据库加载游戏区域时使用SELECT ... FOR UPDATE,它将阻止其他选择,直到您提交或回滚事务。

于 2010-08-24T16:36:10.593 回答
0

不可以。您需要为需要防止冲突更新的表发出 LOCK TABLES 命令。这看起来像......

LOCK TABLE my_table WRITE;

更多细节可以在这里找到...... http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html

之后不要忘记解锁它们!

于 2010-08-24T15:15:44.477 回答