我是高要求游戏编码团队的一员。
我们最近遇到了一些问题,多个请求可以同时发送,并且是联合重复操作(如果它们完全一个接一个地运行,则不会发生这种情况)。
有问题的例程调用 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)