为啥在尝试更新 MySQL 条目时出现“超过锁定等待超时”错误?
Posted
技术标签:
【中文标题】为啥在尝试更新 MySQL 条目时出现“超过锁定等待超时”错误?【英文标题】:Why am I getting a "Lock wait timeout exceeded" error while trying to update a MySQL entry?为什么在尝试更新 MySQL 条目时出现“超过锁定等待超时”错误? 【发布时间】:2015-12-10 23:39:12 【问题描述】:我有一个数据库,我正在尝试更新其中的行值,但出现“锁定等待超时”错误。表格是这样的:
mysql> use rti;
Database changed
mysql> explain resin_products;
+--------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| resin_product_id | int(11) | NO | PRI | NULL | |
| manufacturer | varchar(45) | YES | | NULL | |
| name | varchar(45) | YES | | NULL | |
| model_number | varchar(45) | YES | | NULL | |
| resin_type | varchar(45) | YES | | NULL | |
| primary_type | varchar(45) | YES | | NULL | |
| group | varchar(45) | YES | | NULL | |
| teir | varchar(45) | YES | | NULL | |
| chemical_structure | varchar(45) | YES | | NULL | |
| physical_structure | varchar(45) | YES | | NULL | |
| color | varchar(45) | YES | | NULL | |
| total_capacity | varchar(45) | YES | | NULL | |
| salt_split_CAP | varchar(45) | YES | | NULL | |
| price_per_cuft | varchar(45) | YES | | NULL | |
| comments | varchar(500) | YES | | NULL | |
+--------------------+--------------+------+-----+---------+-------+
命令如下:
mysql> UPDATE resin_products SET price_per_cuft='00.04' WHERE resin_product_id=1;
这是大约 30 秒后出现的错误:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
这是我的“lock_wait”变量设置的:
mysql> show variables like 'lock_wait_timeout';
+-------------------+----------+
| Variable_name | Value |
+-------------------+----------+
| lock_wait_timeout | 31536000 |
+-------------------+----------+
1 row in set (0.00 sec)
【问题讨论】:
Getting “Lock wait timeout exceeded; try restarting transaction” even though I'm not using a transaction的可能重复 或Fixing “Lock wait timeout exceeded; try restarting transaction” for a 'stuck" Mysql table? 查看结果 > SHOW ENGINE INNODB STATUS; 【参考方案1】:先看锁表列表:
show open tables where in_use>0;
您还可以看到正在使用此表的线程:
show full processlist;
然后你可以杀死那个线程
kill 141;
【讨论】:
我没有遇到任何打开的表格问题。这就是我得到的:mysql> show open tables where in_use>0;空集(0.00 秒)我将尝试再次运行产生错误的命令,然后立即执行 show open tables where in_use>0; 可以通过命令查看更多状态:SHOW ENGINE INNODB STATUS\G
原来是进程运行时间过长。我跑了SHOW FULL PROCESSLIST;
,然后把他们都杀了。这解决了问题。以上是关于为啥在尝试更新 MySQL 条目时出现“超过锁定等待超时”错误?的主要内容,如果未能解决你的问题,请参考以下文章
尝试向 MySQL 中的 table.column 添加唯一约束时出现重复条目错误
为啥在使用简单存储过程时出现 MySQL 错误 #1312?
为啥在 C# .Net Core 3 中连接到 MySql 时出现错误
为啥当我看到通配符条目时出现 javax.net.ssl.SSLHandshakeException: No subject Alternative DNS name matching found 异