[解决] Lock wait timeout 之 批量杀死 MySQL 连接进程

🐞 线程锁导致更新失败 mysql, Lock wait timeout exceeded; try restarting

查看所有进程描述(推荐Navicat Query执行)

 show processlist;

【单个】kill 线程号 id,时间长的,全干掉(排除event),看心情删

【批量】

-- show processlist;
SELECT
	concat( 'KILL ', id, ';' ) 
FROM
	information_schema.PROCESSLIST 
WHERE
	time > 500 
	AND USER = 'root';

复制列表拼接的SQL 语句,执行即可

KILL 2176;
KILL 2184;
KILL 2177;
KILL 2185;
KILL 2169;
KILL 2178;
KILL 2170;
KILL 2186;
KILL 2171;
KILL 2172;
### MySQL 锁等待超时与死锁处理 当遇到 `lock wait timeout exceeded` 的错误提示时,表明事务在尝试获取资源上的锁时超过了设定的时间限制[^1]。这种情况通常发生在多个事务相互持有对方所需的资源锁定上,形成所谓的“死锁”。 对于MySQL数据库而言,在检测到死锁发生之后会自动选择牺牲其中一个事务来解除这种僵局状态,并返回给应用程序一个特定类型的SQLSTATE值 '40001' 或者 '41000'[ ^1 ]。 为了终止由死锁引起的长时间挂起的查询过程,可以采取如下措施: #### 查找并杀死涉及死锁的进程 通过执行以下命令查找当前正在运行并且可能是造成死锁原因的线程列表: ```sql SHOW ENGINE INNODB STATUS; ``` 上述语句将会显示最近发生的死锁事件的相关信息以及参与其中的具体事务详情。从中可以获得每个事务对应的Trx_id及其持有的表级或行级别的锁情况描述。根据这些线索定位出有问题的session id(s),进而利用KILL语句结束它们: ```sql KILL QUERY thread_id; -- 只终止指定ID下的查询操作而不关闭连接 -- OR -- KILL CONNECTION thread_id; -- 完全断开客户端链接,适用于更彻底清理场景下 ``` 这里需要注意的是thread_id并非直接等于InnoDB存储引擎报告里的trx_id而是要对应至information_schema库内processlist视图里Process列所记录的实际数值。 另外一种更为自动化的方式是在应用层面上设置较短时间范围内的锁等待时限参数innodb_lock_wait_timeout(单位秒),使得一旦超过此期限即刻回滚引发冲突的一方从而快速恢复系统的正常运转效率而无需人工干预[ ^1 ] : ```sql SET GLOBAL innodb_lock_wait_timeout = 50; ``` 以上方法能够有效应对大多数情况下由于并发访问引起的数据竞争问题所带来的挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值