服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 一文教你学会定位线上MySQL锁超时问题

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

2022-08-16 12:05一灯架构 Mysql

这篇文章主要介绍了一文教你学会定位线上MySQL锁超时问题,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言:

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

一文教你学会定位线上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锁超时问题。

到此这篇关于一文教你学会定位线上MySQL锁超时问题的文章就介绍到这了,更多相关MySQL锁超时内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://juejin.cn/post/7128419961415925790

延伸 · 阅读

精彩推荐
  • MysqlMySQL查询学习之基础查询操作

    MySQL查询学习之基础查询操作

    这篇文章主要给大家介绍了关于MySQL查询学习之基础查询操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...

    没谱的曲8042021-07-01
  • MysqlMySQL中对于索引的基本增删查改操作总结

    MySQL中对于索引的基本增删查改操作总结

    这篇文章主要介绍了MySQL中对于索引的基本增删查改操作总结,索引可以提高MySQL的检索速度,需要的朋友可以参考下 ...

    MYSQL教程网3992020-05-31
  • MysqlMysql8导入数据到Mysql5.7的实现步骤

    Mysql8导入数据到Mysql5.7的实现步骤

    Mysql8的默认字符集为utf8mb4,当我们有需求要把Mysql8的数据导入到Mysql5.7时,就会出现不支持,本文主要介绍了2种解决方法,具有一定的参考价值,感兴趣的...

    wuzzzh4juejin3952022-03-09
  • MysqlMySQL四种事务隔离级别详解

    MySQL四种事务隔离级别详解

    这篇文章主要为大家详细介绍了MySQL四种事务隔离级别的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    花弄影3332020-07-30
  • Mysql一文搞懂MySQL索引页结构

    一文搞懂MySQL索引页结构

    本文主要介绍了MySQL索引页结构,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    程序员小潘11662022-02-28
  • MysqlMysql存储引擎特性总结

    Mysql存储引擎特性总结

    这篇文章主要介绍了Mysql存储引擎特性总结,同时总结了最常用的2种存储引擎的特性,以及各引擎的适用环境,需要的朋友可以参考下 ...

    MYSQL教程网3482020-04-12
  • MysqlMySql安装及登录详解

    MySql安装及登录详解

    这篇文章主要介绍了MySql安装及登录详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    whiskey_yang2592020-07-19
  • MysqlMYSQL使用正则表达式过滤数据

    MYSQL使用正则表达式过滤数据

    这篇文章主要介绍了MYSQL使用正则表达式过滤数据的相关资料,感兴趣的小伙伴们可以参考一下...

    自然鸟神5552020-06-07