我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
我正在运行以下MySQL UPDATE语句:
mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
我没有使用事务,为什么会得到这个错误?我甚至尝试重新启动我的MySQL服务器,它没有帮助。
该表有406,733行。
当前回答
在我的实例中,我正在运行一个异常查询来修复数据。如果你在你的查询中锁定了表,那么你将不必处理锁定超时:
LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;
这对于正常使用可能不是一个好主意。
更多信息请参见:MySQL 8.0参考手册
其他回答
有同样的错误,即使我只是更新一个表与一个条目,但重新启动mysql后,它被解决了。
您是否可以更新这个表中的任何其他记录,或者这个表是否被大量使用?我想的是,当它试图获得一个锁,它需要更新这条记录时,设置的超时已经超时。你可以延长时间,这可能会有所帮助。
mysql> set innodb_lock_wait_timeout=100;
Query OK, 0 rows affected (0.02 sec)
mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 100 |
+--------------------------+-------+
现在再打开锁。你有100秒的时间向数据库发出一个SHOW ENGINE INNODB STATUS\G,并查看其他哪个事务正在锁定你的事务。
查看一下您的数据库是否进行了微调,特别是事务隔离。增加innodb_lock_wait_timeout变量不是一个好主意。
检查MySQL中的数据库事务隔离级别:
mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+-----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation | @@session.tx_isolation |
+-----------------------+-----------------+------------------------+
| REPEATABLE-READ | REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+-----------------+------------------------+
1 row in set (0.00 sec)
您可以通过更改隔离级别来获得改进。使用类似oracle的READ COMMITTED而不是REPEATABLE READ。REPEATABLE READ是InnoDB的默认值。
mysql> SET tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)
此外,仅在必要时尝试使用SELECT FOR UPDATE。
确保数据库表使用InnoDB存储引擎和READ-COMMITTED事务隔离级别。
你可以通过SELECT @@GLOBAL来检查它。tx_isolation @@tx_isolation;在mysql控制台。
如果没有设置为READ-COMMITTED,则必须设置它。在设置之前,请确保您在mysql中拥有SUPER权限。
你可以从http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html上获得帮助。
通过设置这个,我认为你的问题会得到解决。
您可能还希望检查是否试图同时在两个进程中更新此文件。用户(@tala)在这种情况下遇到了类似的错误消息,可能需要仔细检查…