如何确保不会模仿对数据库的多个请求

时间:2012-06-13 22:13:38

标签: mysql database innodb

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

我们最近遇到了一些问题,多个请求可以在同一时间发送,并且是联合重复操作(如果它们完全相继运行则无法发生)。

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

1 个答案:

答案 0 :(得分:2)

MySQL有几种不同的锁定模式

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

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

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