Mysql 如何确保不模拟对数据库的多个请求

Mysql 如何确保不模拟对数据库的多个请求,mysql,database,innodb,Mysql,Database,Innodb,我是高要求游戏编码团队的一员 我们最近遇到了一些问题,其中多个请求可以在同一时间发送,并且是联合重复操作,如果它们完全在彼此之后运行,则不可能发生 有问题的例程调用InnoDB表中的一行,如果存在,则继续执行该例程,直到所有其他检查都正常为止,并在此时完成并删除该行 似乎正在发生的是,尽管行级锁定,读取仍同时命中行,并继续沿着例程路径进行,此时删除不会产生任何影响。这是什么导致发生的是,常规正在复制的球员足够聪明,以尝试他们的运气 有人对解决这个问题有什么建议吗 示例例程 // check da

我是高要求游戏编码团队的一员

我们最近遇到了一些问题,其中多个请求可以在同一时间发送,并且是联合重复操作,如果它们完全在彼此之后运行,则不可能发生

有问题的例程调用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有两种不同的锁定模式

我认为在执行更新/删除时,您需要强制执行独占锁。这样,后续请求将等待锁被释放并且相应的操作完成


您可能还想检查用于这些并发查询的索引。适当的索引机制将最大限度地减少在给定查询期间需要锁定的行数。

我认为您是对的,但不确定如何以查询的形式进行锁定,并且在我运行COMMIT命令之前,锁定是否会保持不变。没有找到这种实现的PHP示例。您可以在查询中设置隔离级别:为什么不在事务中使用SELECT FOR UPDATE而不是更改隔离级别?SELECT FOR UPDATE会阻止后续请求读取该行,直到我们在代码中再次发布它吗?