我正在创建一个游戏,玩家可以挑战数据库中存储的随机玩家。这就是我这样做的方式:(MySQL 数据库)
当用户搜索随机用户时,如果没有用户在等待,我将用户的“等待”属性设置为1。
如果已经有一个用户在等待挑战(“等待”已设置为 1),我会将它们匹配在一起并将其“等待”属性设置为 0。(基本上,我会在数据库表中查询任何具有其身份的用户“等待”属性设置为 1。)
我想我的第一个问题是,这是一个好主意吗?我关心的是同步。如果两个用户同时查询等待的玩家,则等待的用户将被挑战两次。虽然选择查询和更新查询之间的时间范围非常小,但这在技术上是可能的,对吗?
有办法避免这种情况吗?或者这是我不应该担心的事情?
最佳答案
如果您在找到想要匹配的两名玩家的同时更新“等待”标志,则任何其他查询都会看到该更新。 (这可能应该在存储过程中完成,以减少搜索等待玩家然后更新其状态的查询之间的时间。)如果两个查询尝试准确地更改同一行 em> 同时,其中之一将失败,因为应锁定该行以进行更新。
我不确定MySQL是否会产生死锁异常。
确保您的客户端应用程序具有良好的异常处理能力。如果此操作出现异常,表明更新失败,请重试。您可能想要生成一个测试,故意导致您担心的情况,并验证您的修复是否按预期工作。
我期望发生这种情况的唯一方法是,如果您使用参数化查询并且必须执行单独的查询来查找匹配项,然后更新“等待”标志。使用存储过程,在服务器上一次性完成所有操作,并享受更高的稳定性和 Restful 性。
关于mysql - 多个查询修改同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5720048/