我正在运行以下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行。
当前回答
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,并查看其他哪个事务正在锁定你的事务。
其他回答
我来自谷歌,我只是想添加对我有效的解决方案。我的问题是,我试图删除一个大表的记录,它有很多FK级联,所以我得到了与OP相同的错误。
我禁用了自动提交,然后它只在SQL语句的末尾添加COMMIT。据我所知,这将逐位释放缓冲区,而不是在命令结束时等待。
为了保持OP的示例,这应该是有效的:
Mysql > set autocommit=0;
Mysql > update customer set account_import_id = 1;提交;
不要忘记重新激活自动提交,如果你想让MySQL配置和以前一样。
Mysql > set autocommit=1;
迟到的派对(像往常一样),但我的问题是我写了一些糟糕的SQL(作为一个新手)和几个进程对记录有一个锁<-不确定适当的措辞。我最终不得不:SHOW PROCESSLIST,然后使用kill <id>杀死id
我在使用php时遇到过这种情况 语言构念退出;正在进行交易。那么这个 事务“挂起”,你需要杀死mysql进程(如上所述processlist;)
有同样的错误,即使我只是更新一个表与一个条目,但重新启动mysql后,它被解决了。
尝试更新以下两个参数,因为它们必须具有默认值。
Innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
要检查参数值,可以使用下面的SQL语句。
显示全局变量:innodb_rollback_on_timeout