gpt4 book ai didi

mysql - 在不锁定表的情况下防止 MySQL 中的同时数据库更新

转载 作者:行者123 更新时间:2023-11-29 01:56:36 24 4
gpt4 key购买 nike

我有一款多人纸牌游戏。每场比赛由 4 名球员进行。每个玩家都分配了一个座位(1、2、3、4),玩家点击加入游戏,当所有 4 个座位都坐满后,游戏就可以开始了。

数据库中的游戏条目如下所示:

id | status
13 | 3

status 是已满席位的数量。每次有新玩家加入时它都会增加。现在我有一个问题。有时 2 个玩家同时发送请求,他们都被添加到同一个座位。在上面的示例中,收到两个请求,游戏中突然有 5 个玩家,其中 2 个被分配到座位 4。

显然,在我更新之前,我会检查是否已经有 4 个玩家。

类似于:

if($row['status'] < 4){
mysql_query("update games set status=status+1 where id=13");
}

从逻辑上讲,这应该可以防止 status 超过 4,但是如果有很多玩家加入游戏,通常会出现 status 变为 5 的情况,因为多个玩家同时加入。

我想我可以通过使用表锁来防止这种情况发生,但我不想为了更新一行而锁定整个表(可能同时进行 50 场比赛)。

一定有解决这个问题的可靠方法,对吗?

最佳答案

您可以将约束合并到更新语句本身,以便在数据库中对其进行监管:

update games set status = coalesce(status, 0) + 1 
where id=13
and coalesce(status, 0) < 4

关于mysql - 在不锁定表的情况下防止 MySQL 中的同时数据库更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com