代码之家  ›  专栏  ›  技术社区  ›  MattBianco

这就足够了吗,还是我有比赛条件?

  •  2
  • MattBianco  · 技术社区  · 14 年前

    我正在为网络编写一种策略性的多用户游戏。它有一个PlayField(x x x y Squares),我计划将其序列化并存储在MySQL(InnoDB)数据库的一个blob中,每个正在进行的游戏都有一行。

    现在,我试图找出一种好的方法,通过对PlayField的任何更改来保持数据库的更新,同时找到一个方便的解决方案,来解决如何在加载页面和实际移动之间的时间范围内处理PlayField上发生的事情。
    我不使用Ajax。

    每场比赛最多有20名选手,每名选手在24小时内完成1到10个动作,所以这是一场“慢”的比赛。

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

    我担心的是如何防止种族冲突。
    是否足以:

    1. 开始事务。
    2. 从表中加载playfield
    3. 如果校验和不一致-回滚并更新用户视图
    4. 如果校验和不变-更新表并提交更改

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

    感谢所有的建议。

    2 回复  |  直到 14 年前
        1
  •  2
  •   nathan    14 年前

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

        2
  •  0
  •   Brian Hooper    14 年前

    不需要。您需要为需要保护的表发出锁表命令,以防止更新冲突。这看起来像…

    LOCK TABLE my_table WRITE;
    

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

    以后别忘了开锁!