防止双重执行PHP + JS

时间:2015-12-21 15:19:46

标签: php double execution

我正在使用PHP + JS来创建游戏。每个游戏都是人与人,所以只有2个用户。它有效,但我在"双重预订"中遇到了麻烦。像这样:

  1. User1创建游戏#10(PHP)
  2. 游戏出现在大厅(JS)
  3. User2加入游戏#10(PHP)
  4. User3加入游戏#10(PHP)
  5. 游戏从大厅(JS)消失
  6. 步骤3和4仅发生在毫秒之间。当用户加入游戏时,我首先检查"座位"被采取。如果不是 - 我解析所有基本数据等,然后我将座位设置为已采取。在解析过程中,似乎用户可以加入同一个游戏。正如我之前所说,这只是几毫秒。但是我如何防止这种情况呢?

1 个答案:

答案 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界面。