我有一个多人纸牌游戏。每个游戏由4位玩家进行。为每个玩家分配一个席位(1、2、3、4),单击并加入游戏,当所有4个席位都填满后,便可以开始游戏了。
数据库中的游戏条目如下所示:
id | status
13 | 3
该status
是充满席位数目。每当有新玩家加入时,它就会递增。现在我有一个问题。有时,两个玩家同时发送一个请求,并且他们都被添加到同一个座位上。在上面的示例中,收到两个请求,游戏中突然有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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句