我正在为网络编写一种策略式的多用户游戏。它有一个playfield(X by Y square),我打算序列化并存储在MySQL(innodb)数据库的BLOB中,每个正在进行的游戏都有一行。
我现在试图找出一种通过对游戏区域的任何更改来保持数据库更新的好方法,同时找到一个方便的解决方案,以便在加载之间的时间范围内处理发生在游戏区域的事情。页面,并实际上采取行动 我不使用AJAX。
每场比赛最多有20名玩家,每位玩家在24小时内进行1到10次移动,所以这是一个“慢”游戏。
我的计划(到目前为止)还要为blob旁边的playfield存储一种校验和,并在尝试更改playfield之前将数据库状态与加载的状态进行比较。
我担心的是如何预防竞争条件 是否足够:
BEGIN TRANSACTION
是否足以阻止比赛,或者我是否需要在第2步中执行更多操作以显示我更新表格的意图?
感谢所有建议。
答案 0 :(得分:2)
如果从数据库加载playfield时使用SELECT ... FOR UPDATE,它将阻止其他选择,直到您提交或回滚事务为止。
答案 1 :(得分:0)
没有。您需要为需要防止冲突更新的表发出LOCK TABLES命令。这看起来像......
LOCK TABLE my_table WRITE;
可在此处找到更多详细信息...... http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html
不要忘记事后解锁他们!