故障分析 | MySQL锁等待超时一例分析

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

作者:付祥

现居珠海,主要负责 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 ,发现有批量插入动作,由于自增锁竞争产生死锁:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值