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

圣彼得

我有一个多人纸牌游戏。每个游戏由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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不丢失数据的情况下在Cocoa的Application Support目录中复制数据库文件?

如何在不更改数据库模型的情况下在Entity Framework中添加新的实体属性

如何在不执行原始 SQL 查询的情况下在 Activerecord 中添加数据库域?

是否可以在不执行查询的情况下在 oracle 中检查受更新查询影响的行数

如何先使用代码在不进行迁移的情况下在实体框架中应用数据库架构更改

在不更新映像的情况下更改 Docker 中数据库使用的端口参数?

如何在不编写SQL的情况下在python中使用SQL数据库?

如何在不创建数据库的情况下在谜语游戏中保存答案?

如何在不锁定MYSQL 6.2中的表的情况下从另一个表复制数据?

在不离开HTML页面的情况下在HTML页面上显示数据库表

是否可以在不更新应用商店中的应用的情况下更新移动应用的设备上的sqlite数据库?

如何在不触发多次插入/更新查询的情况下向数据库中插入/更新多行?

为什么perl在有价值的情况下在我的数据库中留空?

是否可以在不连接数据库的情况下在sql中打开.bak文件?

如何在不使用视图的情况下在MySQL数据透视表上进行搜索

如何在不手动设置每个属性的情况下更新数据库中的实体对象?

如何在不创建数据库中相应表的情况下创建EntitySet或模型-Entity Framework

如何在不刷新页面的情况下将文本和图像文件数据同时发送到 MySQL 数据库

save()不更新数据库中的表

SaveChangesAsync不更新数据库表中的值

表单不更新 cakephp 代码中的数据库表?

如何在不破坏我的html标签的情况下从mysql数据库中获取注释

如何在不刷新 php 页面的情况下跟踪 mysql 数据库中的更改?

C#在不失去更新数据库能力的情况下在DataGridView中使用两个DataTables

如何在不登录数据库的情况下从MySQL迁移数据?

如何在没有原始迁移文件的情况下更新 django 中的 sqlite 数据库并同时保留 db.sqlite3 中的数据?

在不更改密码的情况下更新后端数据库

ModX:如何在不覆盖内容的情况下更新数据库

如何在不更新实际数据库的情况下更改DBIx :: Class对象的值