mysql - 多个查询修改同一行

标签 mysql database database-design

我正在创建一个游戏,玩家可以挑战数据库中存储的随机玩家。这就是我这样做的方式:(MySQL 数据库)

当用户搜索随机用户时,如果没有用户在等待,我将用户的“等待”属性设置为1。

如果已经有一个用户在等待挑战(“等待”已设置为 1),我会将它们匹配在一起并将其“等待”属性设置为 0。(基本上,我会在数据库表中查询任何具有其身份的用户“等待”属性设置为 1。)

我想我的第一个问题是,这是一个好主意吗?我关心的是同步。如果两个用户同时查询等待的玩家,则等待的用户将被挑战两次。虽然选择查询和更新查询之间的时间范围非常小,但这在技术上是可能的,对吗?

有办法避免这种情况吗?或者这是我不应该担心的事情?

最佳答案

如果您在找到想要匹配的两名玩家的同时更新“等待”标志,则任何其他查询都会看到该更新。 (这可能应该在存储过程中完成,以减少搜索等待玩家然后更新其状态的查询之间的时间。)如果两个查询尝试准确地更改同一行 em> 同时,其中之一将失败,因为应锁定该行以进行更新。

我不确定MySQL是否会产生死锁异常。

确保您的客户端应用程序具有良好的异常处理能力。如果此操作出现异常,表明更新失败,请重试。您可能想要生成一个测试,故意导致您担心的情况,并验证您的修复是否按预期工作。

我期望发生这种情况的唯一方法是,如果您使用参数化查询并且必须执行单独的查询来查找匹配项,然后更新“等待”标志。使用存储过程,在服务器上一次性完成所有操作,并享受更高的稳定性和 Restful 性。

关于mysql - 多个查询修改同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5720048/

相关文章:

php - 在 mysql 启动时运行一些脚本

MySQL 查询对于同一 clientId 多次出现的值

mysql - 编译语句 : FAILED: SemanticException [Error 10036]: Duplicate column name: p_id 时出错

mysql - MariaDB *.myi 文件没有出现在文件管理器中

database - 我在哪里可以找到有关数据库和文件系统设计的有用信息?

MySQL连接所有列

php - 用户 "apache"应该拥有我的 SQLite 数据库吗?

sql - 会计系统设计和数据库

sql - 约束一对多关系或使用预定义的关系约束创建表

django - 将 Django 模型/表拆分为两个模型/表是否有性能优势?