我正在运行以下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行。
当前回答
尝试更新以下两个参数,因为它们必须具有默认值。
Innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
要检查参数值,可以使用下面的SQL语句。
显示全局变量:innodb_rollback_on_timeout
其他回答
完全符合MarkR的说法。自动提交使每个语句成为一个语句事务。
SHOW ENGINE INNODB STATUS会给你一些死锁原因的线索。还要仔细查看慢速查询日志,看看还有什么正在查询表,并尝试删除正在执行满表罐操作的任何内容。行级锁定工作得很好,但当您试图锁定所有行的时候就不行了!
您正在使用一个事务;Autocommit不会禁用事务,它只是让它们在语句的末尾自动提交。
可能发生的情况是,其他一些线程在某个记录上持有记录锁(您正在更新表中的每个记录!)太长时间,而您的线程正在超时。或者在一个事务中对同一行运行多个(2+)UPDATE查询。
可以通过发出命令查看事件的更多详细信息
SHOW ENGINE INNODB STATUS
事件发生后(在SQL编辑器中)。理想情况下,在安静的测试机上执行此操作。
mysql->SHOW PROCESSLIST;
kill xxxx;
然后杀了睡着的那个。对我来说是2156。
尝试更新以下两个参数,因为它们必须具有默认值。
Innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = ON
要检查参数值,可以使用下面的SQL语句。
显示全局变量:innodb_rollback_on_timeout
我在使用php时遇到过这种情况 语言构念退出;正在进行交易。那么这个 事务“挂起”,你需要杀死mysql进程(如上所述processlist;)