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

时间:2015-05-07 13:01:35

标签: mysql performance timeout locking

我正在运行以下更新 -

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

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

我用Google搜索了多次,并为innodb_lock_wait_timeout添加了额外的时间而没有帮助我。

请让我知道此问题的根本原因以及我如何解决它。 我在专用服务器上使用mysql 5.6(主 - 主复制)。 另外table_x(Innodb表)在数据库中大量使用。 Autocommit已开启。

3 个答案:

答案 0 :(得分:1)

看起来你的任何其他交易都有一些锁定。您可以使用以下方法检查INNODB的状态:

SHOW ENGINE INNODB STATUS\G 

检查表上是否有任何锁定:

show open tables where in_use>0;

然后杀死被锁定的进程。

答案 1 :(得分:1)

找出与此UPDATE同时运行的其他语句。听起来好像它运行很长时间挂在这个UPDATE所需的行上。与此同时,这句话正在等待。

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

(在我看来,innodb_lock_wait_timeout的默认值为50秒很高。提高价值只会加剧情况。)

如果你放弃解决冲突的“根本原因”,那么你可能会以不同的方式解决问题。

  1. 降低 innodb_lock_wait_timeout,比方说,5。
  2. 在超时时以编程方式捕获错误并重新启动UPDATE
  3. 同样适用于所有其他交易。其他查询也可能堆积起来;重新启动一些可能会“解开”问题。
  4. SHOW VARIABLES LIKE 'tx_isolation'; - 可能是一个更好的设置,特别是如果一个长期运行的SELECT是恶棍。

答案 2 :(得分:0)

我已经解决了这个问题。我为innodb_lock_wait_timeout尝试了不同的值,也尝试更改查询但得到了同样的错误。我做了一些研究并向同事们询问了hibernate。

他们正在进行多项交易,包括更新主表和最终提交。所以,我建议他们在每个事务上使用commit。最后,我没有得到任何锁定等待时间错误。