MYSQL 8.0 -- 事务中删除不存在的记录导致死锁

news2025/1/19 2:33:54

最近开发的某个功能中,线上偶尔会爆出死锁异常。再大佬同事的帮助下,最终排查出了原因,在此记录一下。

文章目录

      • 业务描述
      • 事务中删除行时锁的表现
      • 场景重现
      • 问题处理

业务描述

  在业绩信息维护中,可以维护相关人员列表,相关人员的信息在数据库中是单独存放的,通过业绩ID关联。
  在这里插入图片描述
  为了防止并发情况的出现,每个业绩操作时会加锁,其他人不能操作。
  这个功能一直没有什么问题,新增的时候插入人员信息,修改的时候先删除再插入人员信息,上线后运行的很正常。
  直到有一天添加了暂存功能,暂存分两种情况:一种是第一次维护的业绩直接暂存,另一种是之前暂存的业绩调整后继续暂存,分别对应着新增业绩和修改业绩的功能。
  当时心想新增和修改的校验都是一样的,索性直接把新增和修改功能的代码直接搬了过来放到了一个接口里面。然而修改业绩时处理人员部分的逻辑会先清空对应人员表,新增业绩时则是直接插入,当时的我认为,新增的时候去清空一下对应表应该也没什么关系吧,顶多清不掉任何数据,多做一个无意义的操作,应该没什么问题,测试了一下功能正常,部署上线,然后人就麻了。

事务中删除行时锁的表现

先创建一个测试表 test_table1
在这里插入图片描述
我们先在一个事务里面删除一行存在的记录,但不提交,别执行 commit;

-- 开启事务
start transaction;
-- 不自动提交
set autocommit = 0;
delete from test_table1 where id = 8;

-- 提交事务
commit;

然后执行以下命令查看事务对应的锁信息

select * from performance_schema.data_locks;

在这里插入图片描述
可以看到,有一行对主键为 8 的行锁写锁。此时当我们在其他事务中执行 delete from test_table1 where id = 8; 时会一直阻塞直到超时。
当我们第一个事务 commit 之后,对应的行锁会释放,事务锁信息被清空了
在这里插入图片描述
当我们不按照主键删除,而是根据查询条件删除,又是另一种情况:

-- 开启事务
start transaction;
-- 不自动提交
set autocommit = 0;
delete from test_table1 where name = 'name3';
-- 提交事务
commit;

在这里插入图片描述
会显示锁住了多行,这其实是邻键锁的表现,具体情况可参考该文章 https://cloud.tencent.com/developer/article/1971381

而我的情况要比上面表现得更简单点,我在新增的时候触发了删除操作,删除了不存在的记录。
在事务中删除不存在的行:

delete from test_table1 where id = 500;

查看事务锁
在这里插入图片描述

supremum pseudo-record ,相当于比索引中所有值都大,但却不存在索引

比如在如下表中,一共三行记录,最大主键是13,会给主键大于 13 的所有行加锁,这个时候我们再其他事物中以 id 自增的方式插入信息时就会阻塞,但是当我们指定 ID 为 1(小于等于13) 时,插入不受影响。
在这里插入图片描述

场景重现

到这里,我们在实现思索场景就比较简单了。
1、开启一个事务一,删除不存在的行信息(不提交)
2、开启一个事务二,删除不存在的行信息(不提交),锁的状态如下,两个事务都持有 supremum pseudo-record 这个锁
在这里插入图片描述
3、在事务一中插入数据 ,不提交,再次查看锁状态。事务一多了一条锁等待,等待事务二释放该锁。

insert into test_table1(name)values('name3');

在这里插入图片描述
4、此时在事务二中在执行插入语句,则会直接爆出异常 Deadlock found when trying to get lock; try restarting transaction,
原因是事务一和事务二等待彼此的 supremum pseudo-record 锁释放,造成死锁。

问题处理

我的处理方式比较简单,因为每个业绩操作时加了锁,所以业绩信息在同一时刻只能有一个人操作,不用考虑同一业绩的并发。我只要在删除人员表之前先查询一下表中存在该业绩的相关人员即可,有则删除,没有不做处理

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

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

相关文章

谁再问我 Kafka,我把这 43 张图甩给他

从Kafka诞生的早期,我就对Kafka投入了很多的关注,虽然不敢说精通Kafka, 但也算是非常熟悉了。 平时在工作之中,几乎天天都在跟这玩意儿打交道,在面试的时候,也会经常聊一些Kafka相关的内容。 Kafka 是一个优秀的分布…

二苯并环辛炔-二硫键-马来酰亚胺,DBCO-SS-Maleimide,DBCO-SS-Mal

基础产品数据(Basic Product Data): CAS号:N/A 中文名:二苯并环辛炔-二硫键-马来酰亚胺 英文名:DBCO-SS-Maleimide,DBCO-SS-Mal 详细产品数据(Detailed Product Data)&am…

C++--数据结构--并查集--高阶0711

1. 并查集 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个 单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类问…

如何使用Python批量化处理Excel——零基础入门指南

本教程旨在帮助零编程基础,但是又有“批量化处理Excel表”这种需求的大家。 在进入教程时,请确保你具有以下资质: 1、 并非工作压到头上了,急需解决一批表所以想过来速成,而是愿意耐心花上几个小时学习来获得一项长久…

Redis之相关拓展(事务、监控、Jedis)

Redis之相关拓展一、事务1、介绍2、流程3、shell命令3.1 开启事务3.2 放弃事务3.3 编译型异常(代码有问题,命令有错)3.4 运行时异常二、监控(watch)1、锁1.1 悲观锁1.2 乐观锁2、注意2.1 原理2.2 流程三、Jedis1、简介…

学习Opencv不得不掌握的操作

OpenCV基本操作 1 图像的IO操作 这里我们会给大家介绍如何读取图像,如何显示图像和如何保存图像。 1.1 读取图像 API cv.imread() 参数: 要读取的图像读取方式的标志cv.IMREAD*COLOR:以彩色模式加载图像,任何图像的透明度都将…

C++ Primer笔记——explicit、string流、vector比较、emplace

目录 一.P265 抑制构造函数定义的隐式转换 二.P287 string流 三.P304 vector的比较 四.P307 在容器中特定位置添加元素 一.P265 抑制构造函数定义的隐式转换 举个例子,如果构造函数参数是string类型,那么当使用赋值符号进行初始化操作时&#xff0c…

leetcode -- ⽤最少数量的箭引爆⽓球(452)

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…

数据模型篇之阿里巴巴数据整合及管理体系

第9章 阿里巴巴整合及管理体系 OneData的设计是为了建设统一的、规范化的数据接人层( ODS )和数据中间层( DWD和DWS ),通过数据服务和数据产品,完成服务于阿里巴巴的大数据系统建设 ,即数据公共…

2022 年 11 月区块链操作系统的开发回顾

查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在寻找区块链操作系统组件的最新进展?你找对地方了!正如在我们的路线图文章中所描述的那样,我们一直在朝着定期且频繁的更新方向发展着,以便让我们的社区能够及时的了解…

微服务框架 SpringCloud微服务架构 多级缓存 46 JVM 进程缓存 46.1 导入商品案例【MySQL环境准备】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存46 JVM 进程缓存46.1 导入商品案例【MySQL环境准备】46.1.1 导入商品管理案例46 JVM 进程缓存 用于在T…

新冠疫情下免疫的重要性以及肠道菌群在其中的作用

今年是新冠病毒影响的第三年了,在病毒的影响下,我们的生活方式发生了很大的变化。近日,多地政府颁布了疫情防控的新政策,除了一些特殊场所,出入其他场所不用扫场所码了。 从一方面说,这样的情况方便了我们日…

DAP数据分析平台可视化组件开发

企业信息化建设会越来越完善,越来越体系化,当今数据时代背景下更加强调、重视数据的价值,以数据说话,通过数据为企业提升渠道转化率、改善企业产品、实现精准运营、有效运营,用数据来指引企业的发展。 组件使用是在DA…

第一章:Pytorch简介和其三大核心概念

文章目录一:什么是Pytorch二:Pytorch优势三:Pytorch三大核心概念(1)tensor(张量)(2)autograd(自动微分-变量)(3)nn.Module…

java计算机毕业设计基于安卓Android的校园安保巡查系统APP

项目介绍 校园安保巡查系统APP管理是校园安保巡查系统管理中对学生必不可少的一个部分。在人们校园安保巡查系统管理的整个过程中,校园安保巡查系统APP管理担负着最重要的角色。为满足如今日益复杂的管理需求,各类校园安保巡查系统APP管理程序也在不断改进。本课题所设计的校园…

精华推荐 |【Redis技术探索】「底层架构原理」帮你彻底搞定Sentinel的实现原理运作机制

👮‍每日一句 最美好的生活方式是和一群志同道合的人,一起奔跑在理想的路上,回头有一路的故事,低头有坚定的脚步,抬头有清晰的远方! 👮‍ Sentinel存在的意义 👮‍ Sentinel出现的前…

如何快速传输大文件,介绍大文件快速方法

现在,企业比以往任何时候都面临着一个重大挑战:需要一个快速共享文件的解决方案。但是,并非所有快速文件传输解决方案都以相同的速度传输文件。文件大小、端点位置、路径、设备、防火墙、网络系统和加密需求都会限制文件的传输速度。 什么是快…

[附源码]Python计算机毕业设计个人相册管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Java中的String类

一、String类的体系图 简单解释:1、String类实现了Serializable接口,说明String类可以串行化,可以进行网络传输。2、String类实现了Comparable接口,说明String对象可以进行比较。 二、String类介绍 String类是lang包中的类&…

【LeetCode每日一题】——337.打家劫舍 III

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 树 二【题目难度】 中等 三【题目编号】 337.打家劫舍 III 四【题目描述】 小偷又发现了一个…