2

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

我们最近遇到了一些问题,多个请求可以同时发送,并且是联合重复操作(如果它们完全一个接一个地运行,则不会发生这种情况)。

有问题的例程调用 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)
4

1 回答 1

2

MySQL 有几种不同的锁定模式

http://dev.mysql.com/doc/refman/5.6/en/innodb-lock-modes.html

我认为您在执行更新/删除时会想要强制执行排他锁。这样后续的请求将一直等待,直到锁被释放并且相应的动作完成。

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

于 2012-06-13T22:24:39.037 回答