MySQL存在"失效事务锁"需清理,因其innodb_lock_wait_timeout仅控制锁等待超时,不清理已卡死却未提交/回滚的悬挂事务,后者会长期持锁阻塞DML。MySQL 为什么会有"失效事务锁"需要清理MySQL 的 innodb_lock_wait_timeout 只控制等待锁的超时,不负责清理已卡死但未提交/回滚的事务。这类事务可能因应用崩溃、网络中断或程序逻辑 bug 导致长期持有锁却不释放,形成"悬挂事务"(zombie transaction),进而阻塞后续 DML。InnoDB 本身不会自动 kill 它们------得靠外部干预。查出正在运行却疑似失效的事务关键不是看"时间长",而是看"没进展还占着锁"。用以下查询定位:SELECT trx_id, trx_mysql_thread_id AS thread_id, trx_started, TIMEDIFF(NOW(), trx_started) AS duration, trx_state, trx_queryFROM information_schema.INNODB_TRX WHERE trx_state = 'RUNNING' AND TIMEDIFF(NOW(), trx_started) > '00:10:00' AND trx_started < NOW() - INTERVAL 10 MINUTE;注意点:trx_state = 'RUNNING' 不代表健康------它可能是 sleep 状态下拿着锁不动,比如应用开了事务但忘了 commit别只依赖 trx_started 时间阈值,要结合业务场景判断:你的正常事务通常几秒?超过 2 分钟就值得怀疑trx_query 为空常见于空事务(BEGIN 后无操作),这种最危险:占锁、不干活、难察觉用 SQL + 定时任务安全 kill 悬挂事务不能直接在定时脚本里写 KILL,必须先确认、再执行、留日志。推荐用存储过程封装判断逻辑:DELIMITER $$CREATE PROCEDURE cleanup_zombie_trx()BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_trx_id VARCHAR(18); DECLARE v_thread_id BIGINT; DECLARE cur CURSOR FOR SELECT trx_id, trx_mysql_thread_id FROM information_schema.INNODB_TRX WHERE trx_state = 'RUNNING' AND trx_started < NOW() - INTERVAL 5 MINUTE AND (trx_query IS NULL OR trx_query = ''); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;<p>OPEN cur;read_loop: LOOPFETCH cur INTO v_trx_id, v_thread_id;IF done THENLEAVE read_loop;END IF;INSERT INTO cleanup_log VALUES (NOW(), v_thread_id, v_trx_id, 'killed');KILL v_thread_id;END LOOP;CLOSE cur;END$$DELIMITER ;调用方式:CALL cleanup_zombie_trx(); There's An AI For That 全球领先的 AI 聚合器,收集10,225个AI工具,可用于超过2,548个任务。
相关推荐
2301_800976932 小时前
数据库的基本操作cyber_两只龙宝2 小时前
【Oracle】Oracle之使用DML语言管理表KIHU快狐2 小时前
快狐KIHU|86寸落地触控一体机G+G电容屏HarmonyOS鸿蒙酒吧查询终端电商API_180079052472 小时前
获取淘宝商品原价、券后价的区别在哪里?难度以及解决办法qq_372906932 小时前
怎么通过宝塔面板对网站数据库进行深度碎片整理_使用Optimize命令优化表空间资源占用财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年4月24日惊鸿若梦一书生2 小时前
《Python 高阶教程》016|偏函数与柯里化:把复杂调用拆成更简单的组合窥视未来2 小时前
MySQL 性能调优完全指南:从硬件到 SQL,一篇吃透難釋懷2 小时前
Redis数据结构-Dict