一文教你学会定位线上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语句。
持有锁的SQL语句找到了,接下来再去找对应的业务代码也就轻而易举了。
以上是基于MySQL5.7版本,在MySQL8.0版本中有些命令已经删除了,替换成了其他命令,下篇文章再讲一下MySQL8.0怎么定位MySQL锁超时问题。
到此这篇关于一文教你学会定位线上MySQL锁超时问题的文章就介绍到这了,更多相关MySQL锁超时内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法总结
我们在安装MYSQL数据库时,经常会出现一些问题,下面这篇文章主要给大家介绍了关于MySQL8.0 Command Line Client输入密码后出现闪退现象的原因以及解决方法的相关资料,需要的朋友可以参考下2023-03-03
redhat7.1 安装mysql 5.7.10步骤详解(图文详解)
这篇文章主要介绍了redhat7.1 安装mysql 5.7.10的步骤详细介绍本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下2016-11-11
Red Hat 安装MySQL 8.0与 Navicat的详细过程
这篇文章主要介绍了Red Hat安装MySQL8.0与Navicat,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-08-08
mysql利用mysqlbinlog命令恢复误删除数据的实现
这篇文章主要介绍了mysql利用mysqlbinlog命令恢复误删除数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-03-03


最新评论