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

网页游戏并发控制

  •  1
  • Tesserex  · 技术社区  · 14 年前

    所以假设我有一个游戏,用户之间互相交流,打架等等。在任何给定的时间,一个玩家都可能参与到与其他玩家的多个交互中,所有人都可以看到事件的发生。当这些玩家中的任何一个登陆网站时,它需要更新任何相关数据并向用户展示。

    当第二个到达的时候,又一次运气不好,玩家B和玩家C同时到达了站点,以便检查他们与玩家A的战斗状态。战斗需要更新关于玩家A的信息。如果我没有正确编码,A的数据可能会被弄乱。

    对于这种情况,我有两个游戏,每个游戏都有不同的解决方案和不同的问题。其中一个使用锁,因此当用户访问站点时,他们获取一个db行上的锁,读取成功获取的锁的数据,然后写入更改并释放锁。但有时,由于未知的原因,这会失败,锁永远卡住,用户抱怨,我们不得不手动修复。我的另一个游戏使用一个守护进程来执行这些事务,使得这个问题(几乎)变得毫无意义,因为只有一个进程在进行这些更改。但玩家仍然可以在同一时间做其他事情,并可能导致同样的问题。

    我读过一些关于这个问题的不同解决方案,比如乐观的或者基于时间戳的控制。我想问:

    1. 我的下一个项目是使用Kohana(PHP)及其ORM,因此我的db写操作默认采用“覆盖所有这些字段”的形式。我是否需要为此编写自己的更新查询,或者我是否可以获得与ORM兼容的解决方案?

    2. 很多解决方案都说,当发生冲突时,要么重试,要么忽略。这对我意味着什么?“重试”是否意味着重新启动整个脚本,这会给用户带来额外的加载时间?我不认为忽略是一个有效的选择,因为事件必须在某个时刻执行。在我发现的其他问题中,向用户显示冲突错误通常是一个有效的选项-对我来说,不是。

    1 回复  |  直到 14 年前
        1
  •  0
  •   Arkh    14 年前

    我想你要找的已经包含在你的问题中了:交易。 如果您使用的是MySQL,则需要使用innoDb引擎设置表,以便能够使用事务。一些文档:

    如果可以的话,不要试图重新发明轮子。