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

标签 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)

最佳答案

MySQL 有几种不同的锁定模式

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

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

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

关于mysql - 如何确保对数据库的多个请求不被模仿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024094/

相关文章:

php - 使用 PHP 显示在线用户列表

mysql - 如何使用 InnoDB 和 ROW_FORMAT=COMPRESSED 获取压缩数据

具有自动生成的主键和唯一键的表上的 Mysql 死锁

mySQL:查询中所有可能的值至少丢失一次

mysql - 仅当其值为 1 时,如何连接一系列 bit (1) 类型的字段?

mysql - 使用mysql启动两个独立的事务

MySQL 用非唯一外键连接第二个表

mysql - 数学路径树输出

如果每列等于相同的值,MySQL 会更新行

mysql - InnoDB "The Table is Full"错误