首页 > 数据库 >记一次MySQL死锁问题排查

记一次MySQL死锁问题排查

时间:2023-08-17 10:56:27浏览次数:32  
标签:事务 服务 删除 RPC 排查 死锁 MySQL 执行

事情的起因:

我司有一款应用处于新旧系统切换阶段,新旧服务同时穿插运行,新服务不断迭代的同时来不断下线旧服务,其中有一个编辑客户信息的功能因为工作量太大,所以其中一部分内容是通过RPC的方式调用新服务的API进行保存的,然后在出现了一个神奇的问题,RPC接口频繁超时,

于是我对RPC接口中各个阶段的代码执行了耗时统计,统计结果如下:

可以很清楚的看到第三个任务足足执行了9秒,但是这个任务是一个非常简单的主键删除,并且只有一行删除代码,没有其他逻辑,而且也可以看到剩余其他任务执行的非常快,所以我估计超时的原因在这个删除的SQL上

 

 

 于是乎,我去云平台上抓了监控,发现这条删除SQL居然执行了7秒之久,表中仅有两万条数据,而且是按照主键进行删除的,这个执行时间非常之不科学

但是我在本地进行单元测试时,任务执行的非常快,丝毫没有这个问题。

 于是乎,我把目标开始转向死锁方向进行排查,执行以下代码获取mysql innodb 引擎的事务会话和锁信息,我发现,当我代码执行时,总是会同时出现两个事务并且其中一个事务的权重非常高,而我执行的SQL一直在进行锁等待,所以我猜测是另一个事务影响了我的删除

 于是乎我根据事务id对innodb的锁进行了排查,发现这两个事务拿的是同一个物理扇区的同一个行锁而且是X排他锁

 但是我自己执行单元测试时,发现并没有这些锁的问题,所以我猜测,是旧服务通过RPC调用我之前对这条数据进行了修改,提前拿到了X锁,所以导致了新服务侧再次拿锁时只能等待

于是我去翻了半天老服务代码,发现果然在RPC调用之前有一个UPDATE操作,这个UPDATE先拿到了X锁,然后RPC调用新服务时,新服务只能在那死等,但是旧服务是等待RPC调用成功后才会提交事务,所以就导致了死锁。

这个BUG说实话犯的很蠢,花了半天的时间才找到原因,期间过于依赖云平台的监控,一直没考虑过是因为新旧服务的锁冲突导致的问题,甚至给阿里云提了工单怀疑是他们数据的问题,最后还是通过最原始的方法才找到了问题的根本原因。

标签:事务,服务,删除,RPC,排查,死锁,MySQL,执行
From: https://www.cnblogs.com/Tassdar/p/17636809.html

相关文章

  • MySQL基本命令及基本操作
    MySQL数据库基本操作原创 Cloud研习社 Cloud研习社 2023-08-1210:33 发表于山东收录于合集#一站式教程274个#计算机248个#mysql8个#linux292个#云计算285个教程每周二、四、六更新基本操作有:查看有哪些数据库、查看有哪些表、创建数据库、创建表、查看表信息、......
  • mysql-查询库中所有表名称或者某一张表的所有字段名称
    --查询某一库中所有表的名称,SELECTa.TABLE_SCHEMA,a.TABLE_NAME,a.TABLE_COMMENTFROMinformation_schema.TABLESaWHEREa.table_type='BASETABLE'ANDa.TABLE_SCHEMA='<数据库名称>';--查询库中某一张表中的所有字段SELECTa.TABLE_SCHEMA,a.TABLE_NAME,a.TA......
  • Java应用堆外内存泄露问题排查
    问题是怎么发现的最近有个java应用在做压力测试压测环境配置:CentOS系统4核CPU8g内存jdk1.6.0_25,jvm配置-server-Xms2048m-Xmx2048m出现问题如下执行300并发,压测持续1个小时后内存使用率从20%上升到100%,tps从1100多降低到600多。排查问题的详细过程首先使用top命令查......
  • 数据库连接工具例如navicat连接mysql报1045错误怎么解决
    问题描述:使用navicat连接数据库的时候,弹出1045错误,但是我的账户密码都是对的,查找了很多方法,只有下面的方法是有用的解决过程1.登录linux服务器中的mysql数据库,确保账户和密码无异常,登录命令如下://登录数据库mysql-uroot-p配置文件确保了给的账号相关信息没有问题后,我又查询......
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为了满足用户的集成与二次开发需求,我们也提供了丰富的API接口供用户调用。有需要的用......
  • MySQL面试题全解析:准备面试所需的关键知识点和实战经验
    MySQL有哪几种数据存储引擎?有什么区别?MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎。可以通过使用"showengines"命令查看MySQL支持的存储引擎。存储方式:MyISAM引擎将数据和索引分别存储在两个不同的文件中,一个是.MYD文件用于存储数据,一个是.MYI文件用于存储索......
  • MySQL事务
    ACID原子性(Atomicity)隔离性(Isolation)一致性(consistency)持久性(Durability)当把现实世界的状态转换映射到数据库世界时,持久性意味着该转换对应的数据库操作所修改的数据都应该在磁盘上保留下来,不论之后发生了什么事故,本次转换造成的影响都不应该被丢失掉事务​是一个......
  • 为什么 MySQL 选择 B+树做索引?
    提到MySQL索引,相信使用过的小伙伴并不陌生,日常工作中,我们经常会加索引来提升查询效率,那么,为什么一个慢查询加上索引查询速度就能提升一个档次?索引后面的实现机制到底是什么?今天就让我们一起来探讨这个话题。申明:本文说的磁盘是指普通的机械磁盘一、索引是什么比如阅读时,索引......
  • mysql-综合案例,练习数据表查询操作
    1.环境搭建创建数据库test1createdatabaseifnotexiststest1; 选择test1数据库创建两张表dept(部门表)和employee(员工表)createtableifnotexistsdept(d_nointprimarykeyauto_incrementcomment"部门编号(自增长主键)",d_namevarchar(10)comment"部......
  • mysql-学习笔记
    --根据需求创建表(设计合理的数据类型、长度)--设计一张员工信息表,要求如下:--1.编号(纯数字)--2.员工工号(字符串类型,长度不超过10位)--3.员工姓名(字符串类型,长度不超过10位)--4.性别(男/女,存储一个汉字)--5.年龄(正常人年龄,不可能存储负数)--6.身份证号(二代身份证号均为18位,身份证中......