小编Ala*_*lan的帖子

并发 MySQL 更新与 InnoDB 挂起(在 Amazon RDS 上)

我遇到了一个问题,即同时执行的多个 MySQL 更新将锁定并需要几分钟才能完成。我正在使用 InnoDB,所以我很困惑为什么会发生这种情况,因为每次更新只更新 1 行。我还使用了一个 m2.4xlarge RDS 实例(它们是最大的)。

卡住更新

这就是我正在做的事情:我有一个包含大约 100M 行的表,其中“views”是一列(已编入索引),我想更新大约 1M 行的视图。在几个不同的服务器上,我有一个这样的循环,其中每个服务器都有自己的一组要更新的行(伪代码):

mysql("set autocommit=0");
mysql("start transaction");

foreach($rows as $row) {
    mysql("update table set views=views+1 where id=$row[id]");
}

mysql("commit");
Run Code Online (Sandbox Code Playgroud)

这会遍历所有需要更新的行。当服务器数量很少时,它工作得很好,比如大约 4,但是当它增长到 10+ 时,更新开始立即挂在“更新”状态。没有说它正在等待锁定,它只是“更新”。这会发生大约 5 分钟,它最终将进行更新并继续循环并最终再次发生。

我不是在寻找进行更新的替代方法。拥有像 tmp 表和

update table,tmp_table set table.views = table.views+tmp_table.views where
  table.id = tmp_table.id
Run Code Online (Sandbox Code Playgroud)

锁定所有正在更新的行,直到它们全部完成(可能需要几个小时),这对我不起作用。他们必须在这些可怕的循环中。

我想知道为什么他们会陷入“正在更新”状态,以及我能做些什么来防止它。

tldr; 有 10 个以上的“更新”循环最终会同时锁定所有正在完成的更新,原因不明,直到他们决定最终进行更新并继续循环,直到它在几秒钟后再次发生。

显示变量:http : //pastebin.com/NdmAeJrz

显示引擎 INNODB 状态:http : //pastebin.com/Ubwu4F1h

mysql innodb concurrency

7
推荐指数
1
解决办法
1万
查看次数

标签 统计

concurrency ×1

innodb ×1

mysql ×1