我是一个高要求游戏的编码团队的一员。
我们最近遇到了一些问题,多个请求可以同时发送,并且是联合重复操作(如果它们完全相继运行,则不会发生这种情况)。
有问题的例程调用 InnoDB 表中的一行,如果存在,则继续执行它的例程,直到所有其他检查都正常,此时它完成并删除该行。
似乎正在发生的情况是读取同时命中行(尽管有行级锁定)并继续沿着例程路径前进,此时删除没有任何区别。造成这种情况的原因是,足够聪明的玩家会重复这个例程来碰碰运气。
有人对解决这个问题有什么建议吗?
例程示例。
// check database row exists (create the initial lock)
// proceed
// check quantity in the row
// if all is okay (few other checks needed here)
// delete the row
// release the lock either way (for the next request to go through)
最佳答案
MySQL 有几种不同的锁定模式
http://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html
我认为您需要在执行更新/删除时强制执行独占锁。这样,后续请求将等待,直到锁被释放并且相应的操作完成。
您可能还想检查用于这些并发查询的索引。适当的索引机制将最大限度地减少给定查询期间需要锁定的行数。
关于mysql - 如何确保对数据库的多个请求不被模仿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024094/