• 手把手教你定位线上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;
    复制代码

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

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

    select * from information_schema.innodb_locks;
    复制代码

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

    lock_trx_id 表示事务ID
    lock_mode 表示排它锁还是共享锁
    lock_type 表示锁定的记录,还是范围
    lock_table 锁的表名
    lock_index 锁定的是主键索引
    

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

    select * from information_schema.innodb_trx; 
    复制代码

    可以清楚的看到正在执行的事务有两个,一个状态是锁等待( 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;
    复制代码

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

    select THREAD_ID,CURRENT_SCHEMA,SQL_TEXT 
    from performance_schema.events_statements_current 
    where thread_id=218;
    复制代码

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

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

     

     

  • 相关阅读:
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-16-处理模态对话框弹窗
    JVM学习(宋红康)之运行时数据区之方法区
    代码随想录 - Day37 - 贪心算法
    leetcode 热题 100
    存储型XSS和BEEF浏览器攻击框架
    Pytorch 实战 LESSON 8 单层回归神经网络 & Tensor新手避坑指南
    NameNode的HA热备实现
    聊聊如何制作自定义ArcGIS Python工具箱
    含文档+PPT+源码等]精品基于SpringCloud实现的分布式电影-微服务毕业设计项目源码-分布式毕设项目[包运行成功]
    Langchain 大型复杂结构文档解析-识别目录和页码
  • 原文地址:https://blog.csdn.net/m0_71777195/article/details/126194178