作者:付祥
现居珠海,主要负责 Oracle、MySQL、mongoDB 和 Redis 维护工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
1、问题现象
开发反馈某业务持续性报锁等待超时,相关错误信息如下:
Lock wait timeout exceeded; try restarting transaction
为了能精确定位问题,继续询问开发有没有锁等待超时相关SQL,开发又给了相关报错SQL:
INSERT INTO <TABLE_NAME> VALUES(...)
2、分析诊断
根据错误信息得知,单条insert语句锁等待超时,如果都是单条insert插入,不应该频繁报锁超时,似乎有点不寻常,当前数据库版本为5.6,锁等待超时参数设置时长30秒:
root@ (none)> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 30 |
+--------------------------+-------+
查看慢日志及 show engine innodb status\G ,发现有批量插入动作,由于自增锁竞争产生死锁:

MySQL批量插入导致锁等待超时问题分析与解决方案

本文介绍了在MySQL 5.6环境下,由于批量插入操作引发的自增锁等待超时问题。作者通过分析错误信息、查询参数和执行计划,发现SQL存在优化空间,特别是子查询导致的效率低下。通过对SQL进行改写,避免了子查询的使用,显著降低了执行时间,从而解决了锁等待超时的问题。
最低0.47元/天 解锁文章
1192

被折叠的 条评论
为什么被折叠?



