一文教你学会定位线上MySQL锁超时问题

作者:一灯架构 时间:2024-01-22 13:19:45 

前言:

昨晚我正在床上睡得着着的,突然来了一条短信。

一文教你学会定位线上MySQL锁超时问题

什么?线上的订单无法取消!

我赶紧登录线上系统,查看业务日志。

一文教你学会定位线上MySQL锁超时问题

发现有MySQL锁超时的错误日志。

不用想,肯定有另一个事务正在修改这条订单,持有这条订单的锁。

导致当前事务获取不到锁,一直等待,直到超过锁超时时间,然后报错。

既然问题已经清楚了,接下来就轮到怎么排查一下到底是哪个事务正在持有这条订单的锁。

好在MySQL提供了丰富的工具,帮助我们排查锁竞争问题。

现场复现一个这个问题:

创建一张用户表,造点数据:

CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
 `name` varchar(50) NOT NULL DEFAULT '' COMMENT '姓名',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

事务1,更新id=1的用户姓名,不提交事务:

begin;
update user set name='一灯' where id=1;

事务2,删除id=1的数据,这时候会产生锁等待:

begin;
delete from user where id=1;

接下来,我们就通过MySQL提供的锁竞争统计表,排查一下锁等待问题:

先查一下锁等待情况:

select * from information_schema.innodb_lock_waits;

一文教你学会定位线上MySQL锁超时问题

可以看到有一个锁等待的事务。

然后再查一下正在竞争的锁有哪些?

select * from information_schema.innodb_locks;

一文教你学会定位线上MySQL锁超时问题

可以看到,MySQL统计的非常详细:

lock_trx_id 表示事务ID

lock_mode 表示排它锁还是共享锁

lock_type 表示锁定的记录,还是范围

lock_table 锁的表名

lock_index 锁定的是主键索引

再查一下正在执行的事务有哪些?

select * from information_schema.innodb_trx;

一文教你学会定位线上MySQL锁超时问题

可以清楚的看到正在执行的事务有两个,一个状态是锁等待(LOCK WAIT),正在执行的SQL也打印出来了:

delete from user where id=1;

正是事务2的删除语句。

不用问,第二条,显示正在运行状态(RUNNING)的事务就是正在持有锁的事务1,MySQL线程id(trx_mysql_thread_id)是193。

我们用MySQL线程id查一下事务线程id:

select * from performance_schema.threads where processlist_id=193;

一文教你学会定位线上MySQL锁超时问题

找到对应的事务线程id是218,然后再找一下这个线程正在执行的SQL语句:

select THREAD_ID,CURRENT_SCHEMA,SQL_TEXT
from performance_schema.events_statements_current
where thread_id=218;

一文教你学会定位线上MySQL锁超时问题

可以清楚的看到这个线程正在执行的SQL语句就是事务1的update语句。

持有锁的SQL语句找到了,接下来再去找对应的业务代码也就轻而易举了。

以上是基于MySQL5.7版本,在MySQL8.0版本中有些命令已经删除了,替换成了其他命令,下篇文章再讲一下MySQL8.0怎么定位MySQL锁超时问题。

来源:https://juejin.cn/post/7128419961415925790

标签:MySQL,锁,超时
0
投稿

猜你喜欢

  • Python函数关键字参数及用法详解

    2023-08-13 00:34:06
  • Python使用python-docx读写word文档

    2023-12-27 06:27:30
  • 基于python3+OpenCV实现人脸和眼睛识别

    2023-06-08 04:20:14
  • Python 捕获代码中所有异常的方法

    2022-08-31 06:44:00
  • MySql在Mac上的安装与配置详解

    2024-01-27 03:09:52
  • win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法

    2023-02-12 14:02:00
  • 美工自我培养的几点经验总结

    2009-11-19 12:57:00
  • python3用urllib抓取贴吧邮箱和QQ实例

    2022-05-15 16:25:18
  • Python使用代理抓取网站图片(多线程)

    2023-06-25 17:34:50
  • perl子程序的运用及子程序中变量私有(my)声明的重要性

    2023-08-10 18:13:49
  • python实现随机梯度下降(SGD)

    2021-04-15 19:41:20
  • 网页设计中的对比原则与接近性原则

    2010-03-30 14:51:00
  • python颜色随机生成器的实例代码

    2022-12-03 19:40:05
  • Python列表常见操作详解(获取,增加,删除,修改,排序等)

    2021-02-04 10:10:19
  • 如何用 Python 制作一个迷宫游戏

    2022-03-29 20:44:07
  • python绘制封闭多边形教程

    2023-08-12 04:55:00
  • Python编程matplotlib绘图挑钻石seaborn小提琴和箱线图

    2022-03-06 20:08:29
  • pandas时间序列之如何将int转换成datetime格式

    2023-03-09 07:50:34
  • php 读取文件头判断文件类型的实现代码

    2023-11-15 09:50:06
  • 并行查询让SQL Server加速运行

    2009-03-16 16:31:00
  • asp之家 网络编程 m.aspxhome.com