错误 1205 (HY000):更新时超出锁定等待超时 mysql

ERROR 1205 (HY000): Lock wait timeout exceeded on update mysql

我正在 运行 关注更新 -

update table_x set name= 'xyz' where id = 121;

并获得 - ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

我用谷歌搜索了很多次,并增加了额外的时间 innodb_lock_wait_timeout 并没有帮助我。

请告诉我这个问题的根本原因以及我该如何解决。 我在专用服务器上使用 mysql 5.6(主-主复制)。 此外 table_x(Innodb table) 在数据库中大量使用。自动提交已开启。

您的任何其他交易似乎都被锁定了。您可以使用以下命令检查 INNODB 的状态:

SHOW ENGINE INNODB STATUS\G 

像这样检查表上是否有锁:

show open tables where in_use>0;

然后杀死被锁定的进程。

找出与此UPDATE同时存在的其他语句运行。听起来好像 运行 很长一段时间 挂在这个 UPDATE 需要的行上。同时这条语句正在等待。

查看它的一种方法是在 UPDATE 挂起时执行 SHOW FULL PROCESSLIST;

(在我看来,innodb_lock_wait_timeout 的默认值 50 秒太高了。提高该值只会加剧这种情况。)

如果您放弃解决冲突的 'root cause',那么您可能会以不同的方式解决问题。

  1. 降低 innodb_lock_wait_timeout 到,比方说,5.
  2. 在超时时以编程方式捕获错误并重新启动 UPDATE
  3. 对所有其他交易也这样做。其他查询也可能堆积如山;重新启动一些可能 "uncork" 问题。

SHOW VARIABLES LIKE 'tx_isolation'; -- 可能 是一个更好的设置,特别是如果长-运行 SELECT 是反派。

我已经解决了问题。我为 innodb_lock_wait_timeout 尝试了不同的值,也尝试更改查询但得到了相同的错误。我做了一些研究,并向我的同事询问了有关休眠的信息。

他们正在进行大量交易,其中包括更新主要 table 并最终提交。所以,我建议他们在每笔交易中使用 commit。最后我没有收到任何锁定等待超时错误。