「MySQL」- ERROR 1205

  CREATED BY JENKINSBOT

问题描述

执行 INSERT 语句时,产生如下错误:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

从字面上看是因为达到了innodb_lock_wait_timeout设置的超时时间。

但是为什么会产生这个问题呢,总不能盲目的去修改这个超时时间吧?

系统环境

SELECT @@version; 5.6.14-log
SHOW VARIABLES LIKE ‘%autocommit%’; autocommit=ON
SHOW VARIABLES LIKE ‘innodb_lock_wait_timeout’; innodb_lock_wait_timeout=50

问题原因

对于InnoDB引擎,所有的用户活动都会触发一个内部的事务。如果启用了autocommit模式,则每个SQL语句自己形成一个事务。默认情况下,每个连接的autocommit都是启动的,可以通过SHOW VARIABLES LIKE '%autocommit%';语句查看当前连接是否为autocommit=ON的状态。在autocommit=ON状态下,如果语句执行成功,那会被自动提交。如果失败,提交或者回滚取决于错误类型,参考「Section 14.21.4, “InnoDB Error Handling”」手册。

超时的事务,尝试锁定表,但是该表被另一个进程持有,并且超时变量设置的比较短,所以它显示错误。

可以通过 SHOW ENGINE INNODB STATUS \G 命令查看更多状态,通过 SHOW OPEN TABLES WHERE in_use > 0; 查看被锁的表,最后通过 SHOW FULL PROCESSLIST 命令查看。

解决办法

现在,可以结束线程,或等待完成它。

参考文献

14.7.2.2 autocommit, Commit, and Rollback
Getting “Lock wait timeout exceeded; try restarting transaction” even though I’m not using a transaction
How can I show mysql locks?
How to debug Lock wait timeout exceeded on MySQL?