防止双重执行PHP+JS
Prevent double execution PHP+JS
我正在使用 PHP + JS 创建游戏。每个游戏都是人对人,所以只有 2 个用户。它有效,但我在使用 "double bookings" 时遇到了问题。像这样:
- User1 创建游戏 #10 (PHP)
- 游戏出现在大厅 (JS)
- User2 加入游戏 #10 (PHP)
- User3 加入游戏 #10 (PHP)
- 游戏从大厅消失 (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
界面。
我正在使用 PHP + JS 创建游戏。每个游戏都是人对人,所以只有 2 个用户。它有效,但我在使用 "double bookings" 时遇到了问题。像这样:
- User1 创建游戏 #10 (PHP)
- 游戏出现在大厅 (JS)
- User2 加入游戏 #10 (PHP)
- User3 加入游戏 #10 (PHP)
- 游戏从大厅消失 (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
界面。