我正在使用PHP + JS创建一个游戏。每个游戏都是人对人,所以只有两个用户。这很管用,但我很难接受“双人预订”。如下所示:
步骤3和步骤4的间隔仅为毫秒。当用户加入游戏时,我首先检查“座位”是否被占用。如果没有,我解析所有的基本数据,等等,然后我把座位设置为已占的位置。在解析过程中,用户似乎可以加入相同的游戏。正如我前面所说,这是一个毫秒的问题。但我怎样才能阻止这一切呢?
发布于 2015-12-21 15:37:26
您可以使用隐式数据库记录锁,方法是执行一种测试集操作以获得空闲座位,如下所示:
UPDATE blackjack_hands
SET user_id = :user_id
WHERE user_id IS NULL
AND blackjack_id = :blackjack_id
AND creator = '0';然后检查更新记录的数量(例如,在行中),以确定座位是否成功(这意味着它是免费的)。
这样,第二个用户就不可能进行同样成功的更新。
这将是悲观锁定的一个例子。
上面的查询假设在游戏创建期间,您将立即插入两条记录,一条用于创建者的user_id (正如您已经做的那样),另一条用于未知对手的user_id,初始化为NULL。
注意:考虑从不推荐的mysql_*函数中移开。您可以使用mysqli_*或PDO接口。
https://stackoverflow.com/questions/34398977
复制相似问题