mysql为什么会出现锁定超时错误_排查系统负载与事务冲突

张开发
2026/4/10 2:06:14 15 分钟阅读

分享文章

mysql为什么会出现锁定超时错误_排查系统负载与事务冲突
Lock wait timeout exceeded 表示事务等待行锁超时默认50秒本质是被其他长事务或未提交操作阻塞并非数据库性能问题需通过INNODB_TRX和performance_schema定位锁源排查索引缺失、MDL锁及锁链式等待。Lock wait timeout exceeded 是锁没抢到不是数据库卡了这个错误本质是当前事务在等某一行的锁但等太久默认50秒被 MySQL 主动放弃了。它不反映 CPU 或磁盘忙而是明确告诉你——有别的事务正霸占着你要改的数据且迟迟不放手。常见现象包括UPDATE 卡住、DELETE 报错、甚至看似无害的 INSERT尤其批量插入时受 innodb_autoinc_lock_mode 影响开发常误以为“SQL 慢”其实慢的是等锁不是执行本身。先查锁等待源头运行 SELECT * FROM information_schema.INNODB_TRX; 看哪些事务在跑、持续多久、在执行哪条 SQL再查谁在堵路配合 SELECT * FROM information_schema.INNODB_LOCK_WAITS; 和 INNODB_LOCKSMySQL 5.7 已移除需用 performance_schema.data_locks 替代定位阻塞者别只盯慢日志锁等待超时的 SQL 可能本身很快只是前面被卡住了重点看 trx_started 时间和 trx_state LOCK WAIT 的记录长事务和未提交操作是最常见的“锁源”一个开了 3 分钟还没 COMMIT 或 ROLLBACK 的事务会一直拿着行锁不放。哪怕它只 update 了一行后续所有想碰这行的请求都会排队等它——直到超时。典型场景调试时手动开启事务后忘记提交Spring 中 Transactional 方法里调用了耗时外部服务如 HTTP 请求导致事务悬停或代码异常跳出但没触发回滚逻辑。检查应用层是否做了显式事务控制尤其注意 try-catch 后缺 transaction.rollback()MySQL 侧可临时设低阈值暴露问题SET SESSION innodb_lock_wait_timeout 5;仅会话级不影响全局避免在事务中做非 DB 操作RPC、文件读写、sleep() 都应移出事务边界索引缺失会让锁从“行级”升级成“伪表级”没有合适索引时MySQL 找不到目标行只能全表扫描——过程中会对扫到的每一行加锁即使最后不修改。结果就是你只想改 ID123 的用户却锁住了 80 万行其他事务一碰这张表就卡。 Shakespeare 一款人工智能文案软件能够创建几乎任何类型的文案。

更多文章