防止双重执行PHP+JS

Prevent double execution PHP+JS

我正在使用 PHP + JS 创建游戏。每个游戏都是人对人,所以只有 2 个用户。它有效,但我在使用 "double bookings" 时遇到了问题。像这样:

  1. User1 创建游戏 #10 (PHP)
  2. 游戏出现在大厅 (JS)
  3. User2 加入游戏 #10 (PHP)
  4. User3 加入游戏 #10 (PHP)
  5. 游戏从大厅消失 (JS)

第 3 步和第 4 步仅相隔几毫秒。当用户加入游戏时,我首先检查 "seat" 是否被占用。如果没有 - 我解析所有基本数据等,然后我将座位设置为已占用。在解析过程中,似乎用户可以加入同一个游戏。正如我之前所说,这只是几毫秒的事情。但是我该如何防止呢?

您可以使用隐式数据库记录锁,通过执行一种 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 界面。