我正在使用PHP + JS来创建游戏。每个游戏都是人与人,所以只有2个用户。它有效,但我在"双重预订"中遇到了麻烦。像这样:
步骤3和4仅发生在毫秒之间。当用户加入游戏时,我首先检查"座位"被采取。如果不是 - 我解析所有基本数据等,然后我将座位设置为已采取。在解析过程中,似乎用户可以加入同一个游戏。正如我之前所说,这只是几毫秒。但是我如何防止这种情况呢?
答案 0 :(得分:0)
您可以通过执行一种test-and-set操作获取免费席位来使用隐式数据库记录锁定,如下所示:
UPDATE blackjack_hands
SET user_id = :user_id
WHERE user_id IS NULL
AND blackjack_id = :blackjack_id
AND creator = '0';
然后检查更新记录的数量(例如,使用msqli_affected_rows),以确定座位是否成功(这意味着它是免费的)。
这样,第二个用户就无法进行相同的成功更新。
这将是悲观锁定的一个例子。
上述查询假设在游戏创建过程中,您会立即插入两个记录,一个用于创建者的user_id(当然您已经这样做了),另一个用于未知对手的user_id,初始化为NULL。
注意:请考虑放弃已弃用的mysql_*
函数。您可以使用mysqli_*
或PDO
界面。