记录生产mysql死锁解决过程

news2024/11/25 0:26:06

最近生产上每个星期都会有几次死锁告警异常,今天终于给处理了,待后续观察,记录下整个过程。

环境:springboot、mybatis、mysql(RC隔离级别)

表结构:

CREATE TABLE `table1` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `prize_key` varchar(128) ,
  'case_id'
  `in_case_index` int,

  PRIMARY KEY (`id`),
  KEY `idx_case_id` (`case_id`)
);

阿里云日志告警:

### Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

立刻查找生产mysql死锁日志:

show engine innodb status;

------------------------
LATEST DETECTED DEADLOCK
------------------------
2023-06-26 14:19:21 0x7fb2ddf141ff700
*** (1) TRANSACTION:
TRANSACTION 2221516621, ACTIVE 0 sec fetching rows
mysql tables in use 2, locked 2
LOCK WAIT 676 lock struct(s), heap size 73936, 6770 row lock(s), undo log entries 10
MySQL thread id 14996730, OS thread handle 14040d64831044096, query id 462343171910 10.1.4.1 lottery executing
insert into X
     ( prize_key,
        prize_type,

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516621 lock mode S locks rec but not gap

Record lock, heap no 8 PHYSICAL RECORD: n_fields 33; compact format; info bits 128
 0: len 8; hex 80000000d001bdb6d7; asc         ;;
 1: len 6; hex 00008468599e; asc    hY ;;
 2: len 7; hex 01000003571172; asc     W r;;
 3: len 30; hex 64643332343238332d313032652d1346335652d623131342d633537316663; asc dd324283-102e-4c5e-b114-c571fc; (total 36 bytes);

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516621 lock mode S locks rec but not gap waiting
Record lock, heap no 42 PHYSICAL RECORD: n_fields 33; compact format; info bits 128
 0: len 8; hex 8000000000bdb6f3; asc         ;;
 1: len 6; hex 00008469a753; asc    i S;;
 2: len 7; hex 020000096b30c4; asc     k0 ;;
 3: len 30; hex 36356265633039662d633136662d3432323112d623063352d353933626362; asc 65bec09f-c16f-4221-b0c5-593bcb; (total 36 bytes);



*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516627 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 33; compact format; info bits 128
 0: len 8; hex 8000000000bdb6d1; asc         ;;
 1: len 6; hex 00008469a753; asc    i S;;
 2: len 7; hex 020000096b162a; asc     k *;;
 3: len 30; hex 3038343738306d6322d323362362d3464611652d616333612d313639626136; asc 084780f2-23b6-4dae-ac3a-169ba6; (total 36 bytes);

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516627 lock_mode X locks rec but not gap waiting
Record lock, heap no 33 PHYSICAL RECORD: n_fields 33; compact format; info bits 128
 0: len 8; hex 8000000000bdb6f0; asc         ;;
 1: len 6; hex 000084685661; asc    hVa;;
 2: len 7; hex 81000001350143; asc     5 C;;
 3: len 30; hex 66643332656336622d363536662d343761392d6166139342d333563653634; asc fd32ec6b-656f-47a9-af94-35ce64; (total 36 bytes);

*** WE ROLL BACK TRANSACTION (2)

根据事物1和事物2的sql,以及java报错的堆栈信息,找到发生问题的代码。

大致如下:

// 事物1
for () {
   xxmaper.insert();
}

//事物2
xxmaper.update(list);

大概看了下,俩个事物不会存在插入和修改的数据冲突。

只能查看mysql审计日志了,通过阿里云后台,用MySQL thread id,分别查到 俩个事物所有运行的sql。大致如下:

--事物1:
-- 10个insert
insert into table1
     ( prize_key,prize_type, `case_id`,`in_case_index` ) 
     values ( 'cf2c9336-4bcc-44f8-b57a-e9a020c9e2f3','Z', 11133, (SELECT a.ci+1 from (SELECT IFNULL(MAX( `in_case_index`),0) as ci  FROM `table1` WHERE `case_id` = 111) as a) );

-- 事物2
-- 100多个update
update table1 where prize_key in ('','');

看到最终的sql,有点眉目了,再次查看mysql死锁日志。得到如下结果:

事物1执行到sql,
insert into table1
     ( prize_key,prize_type, `in_case_index` ) 
     values ( '1cf2c9336-4bcc-44f8-b57a-e9a020c9e2f3','Z',
 (SELECT a.ci+1 from (SELECT IFNULL(MAX( `in_case_index`),0) as ci  FROM `table1` WHERE `case_id` = 68033) as a) )
 
拿到s锁: 
HOLDS THE LOCK(S):  666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516621 lock mode S locks rec but not gap
  
具体s锁记录:386fd81cc-4689-4f20-89d1-e98967,fd32ec6b-656f-47a9-af94-35ce64,
 
等待s锁:RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516621 lock mode S locks rec but not gap waiting

具体等待记录:65bec09f-c16f-4221-b0c5-593bcb


事物2:
拿到x锁: HOLDS THE LOCK(S):  RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516627 lock_mode X locks rec but not gap

具体x锁记录:084780f2-23b6-4dae-ac3a-169ba6,,65fee89c-2d22-4abd-a8d1-0d9357

等待X锁:RECORD LOCKS space id 666 page no 864646 n bits 112 index PRIMARY of table `xx`.`table1` trx id 2221516627 lock_mode X locks rec but not gap waiting

具体等待记录记录:fd32ec6b-656f-47a9-af94-35ce64,
 

说白了,就是:

事物1拿到了S锁,等待X锁; 这个X锁被事物2拿到了;

事物2拿到了X锁,等待S锁;这个S锁被事物1拿到了;

分析已经很到位了,下面就是本地复现。

将相关sql复制到本地,开两个窗口,关闭自动提交。确实复现了。

最终解决方案:

因为事物1拿到的是s锁,且是主键锁,所以最简单办法就是 select里面,避免去回表。

SELECT a.ci+1 from
      (SELECT IFNULL(MAX( `in_case_index`),0) as ci  FROM `table1` WHERE `case_id` = 1111) as a

执行计划看到的是走的索引idx_case_id。

于是给这个索引加了一个组合,idx_case_id(case_id,in_case_index);

再次走 执行计划,确实没有回表了。

 至此mysql死锁问题解决,后面就是静静的等待结果了,没有结果就是最好的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASP.NET Core MVC 从入门到精通系列文章(完)

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生&#xff0c…

redis高可用与持久化

文章目录 一、Redis 高可用1. 概念2. 高可用技术以及作用2.1 持久化2.2 主从复制2.3 哨兵2.4 集群 二、Redis 持久化1. 持久化的功能2. Redis 持久化方式 三、RDB 持久化1. 概述2. 触发条件2.1 手动触发2.2 自动触发2.3 其他自动发机制 3. 执行流程4. 启动时加载 四、AOF 持久化…

自动驾驶货车编队行驶-车辆通讯应用层数据交互要求

1 范围 本文件规定了合作式自动驾驶货车编队行驶时车辆通信应用层数据交互的通信系统架构、通用要求、 数据交互要求、消息层数据集定义等。本文件仅涉及编队成员内部进行编队控制及成员管理相关的车-车通 信交互,不涉及编队与其他实体(云平台、路侧单元…

关于jetBrains的插件translation的使用

文章目录 前言国内使用问题关于无法翻译问题关于无法语音解析问题关于百度翻译Api获取关于百度引擎的invalid account(未解决)关于阿里翻译Api获取关于阿里翻译引擎Wrong request parameter(未解决)有道翻译Api关于有道Ip Address错误(未解决) 前言 translation是一个非常好用…

chatgpt赋能python:Python长浮点型介绍

Python长浮点型介绍 Python是一种强大的编程语言,通过其众多的数据类型,使开发人员可以快速开发复杂的应用程序。其中,Python长浮点型就是Python支持的一种数据类型。长浮点型是指Python可以处理的浮点数的精度可以高达256位。 Python长浮点…

大像素全景,如何让自己的VR全景变得具有高级感?

一个成功的VR全景作品,如果想要在商业领域上获得一定影响力,那么VR全景本身的质量就是关键,如何让自己的VR全景变得具有高级感呢? 从艺术表达手法上,航拍是对VR全景很好的诠释,通过VR全景航拍,人…

Redis进阶 - Redis分片集群

原文首更地址,阅读效果更佳! Redis进阶 - Redis分片集群 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-advance-sharded-cluster.html 搭建分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&a…

ROS自带OpenCV和本地OpenCV版本冲突问题解决

1、报错信息 首先catkin_make编译功能包没有任何问题,100%生成目标文件,但是报了警告:库文件libmyslam.so需要的是libopencv_core.so.3.4,可能会与libopencv_core.so.3.2冲突。根据工程经验,警告不用管,直…

《设计模式》中介者模式

《设计模式》中介者模式 定义: 中介者模式又称为调停者模式,用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其可以松散耦合,独立地改变它们之间的交互。属于行为型设计模式。 中介者…

前端解析后台返回得文件流导出得 pdf为空

封装的方法 download(res, type, filename) {// 创建blob对象,解析流数据const blob new Blob([res.data], {// 如果后端没返回下载文件类型,则需要手动设置:type: application/pdf;chartsetUTF-8 表示下载文档为pdf,如果是word则…

2023上半年软考系统分析师科目一整理-13

2023上半年软考系统分析师科目一整理-13 给定关系模式 R < U &#xff0c;F >&#xff0c; U {A&#xff0c;B&#xff0c;C&#xff0c;D &#xff0c;E} &#xff0c; F {B→A &#xff0c;D→A &#xff0c;A→E &#xff0c;AC→B }&#xff0c;则 R 的候选关键字为…

2023上半年软考系统分析师科目一整理-11

2023上半年软考系统分析师科目一整理-11 给定关系R(A,B,C,D,E) 和关系S(D,E,F,G&#xff09;&#xff0c;对其进行自然连接运算R ▷◁S后其结果集的属性列为( B )。 A. R.A, R.B, R.C, R.D, R.E, S.D, S.E B. R.A, R.B, R.C, R.D, R.E, S.F, S.G C. R.A, R.B, R.C, R.D, R.E,…

爬虫---某翻译响应解密和sign逆向

目标网址接口&#xff1a;aHR0cHM6Ly9kaWN0LnlvdWRhby5jb20vd2VidHJhbnNsYXRl 仅供学习交流使用&#xff0c;非商业用途&#xff0c;如有侵权&#xff0c;请联系删除!!!仅供学习交流使用&#xff0c;非商业用途&#xff0c;如有侵权&#xff0c;请联系删除!!!仅供学习交流使用&…

软件测试技能,JMeter压力测试教程,设置集合点(十七)

一、前言 LoadRunner 中可以设置一个集合点&#xff0c;设置多个虚拟用户等待到一个时间点&#xff0c;到齐后一起发请求达到并发的目的 jmeter 中使用 同步定时器 Synchronizing Timer实现 LoadRunner 中集合点的功能&#xff0c;模拟多用户并发测试&#xff0c;即多个线程在…

K折交叉验证

目的 模型在一套训练集和数据集上表现优秀&#xff0c;不能说明问题&#xff0c;只有在众多不同的训练集和测试集上表现都优秀&#xff0c;模型才具有真正的泛化能力。 通过交叉验证&#xff0c;验证模型的泛化能力&#xff0c;帮助我们认识模型。 常用方法之K折交叉验证 分…

一步一步学OAK之六:通过OAK相机实现特征检测

目录 特征检测Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 创建pipelineSetup 5: 创建节点创建相机节点创建特征检测节点创建数据交互的节点 Setup 6:设置相关属性设置相机的相关属性设置特征检测器的初始配置 Setup 7: 建立链接关系建立相机和特征跟踪器…

iOS 16 版本适配

1、iOS 16 真机调试时需要在设备的设置 —> 隐私与安全 —> 开发者模式 中打开开发者模式。 2、隐私权限增强&#xff0c;如通过 UIDevice 获取设备名称时&#xff0c;无法获取用户的信息&#xff0c;只能获取设备对应的名称&#xff08;[UIDevice currentDevice].name返…

基于Python所写的影视作品分析设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87964875 《开心麻花影视作品分析》程序使用说明 在PyCharm中运行《开心麻花影视作品分析》即可进入如图1所示的系统主界面。在该界面中&#xff0c;选择要分析的电影名称&#xff0c;然…

android:RadioGroup的使用

一、前言&#xff1a;工作中会遇到勾选不同的类型&#xff0c;获得不同的数据。仅以此笔记记录。 二、上代码&#xff1a; 新建一个Activity public class RadioHorizontalActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {private Text…

线程并发同步--条件变量--conditional_variable

同步&#xff1a;我的线程完成之后&#xff0c;你在进行下一个线程。可以理解为进货和卖货&#xff0c;即只有进或的线程结束后才可以执行卖货的这个线程。 c中提供了一个工具&#xff1a;conditional_variable。实现有两种方式&#xff0c;一种是condition_variable和conditon…