记录一次Mysql死锁事件(由Insert与uniqueKey导致)

news2024/11/25 12:10:56

| 导语记录一次于2023年01月23日遇到的死锁问题。

84c72b243b6b108717e265a5d324b570.png


1、基础

1.1 数据库隔离级别

1.1.1RC

READ COMMITTED:只能读取已经提交的数据;此时:允许幻读和不可重复读,但不允许脏读,所以RC隔离级别要求解决脏读;

1.1.2RR

REPEATABLE READ:同一个事务中多次执行同一个select,读取到的数据没有发生改变;此时:允许幻读,但不允许不可重复读和脏读,所以RR隔离级别要求解决不可重复读;

1.2 加锁范围的锁

  1. 行锁:Lock 也就是我们所说的记录锁,记录锁是对索引记录的锁,注意,它是针对索引记录,即它只锁定记录这一行数据

  2. 间隙锁GapLock:将记录之间的间隙锁住,间隙锁住了便可以解决幻读问题,只在RR隔离级别有效。

  3. NextKeyLock:既想锁定一行,又想锁定行之间的记录,就是NextKey,即1和2的结合体。

1.3 加锁角度的锁

  1. S锁:共享锁/读锁,S LOCK可以同时分发给多个TX,允许多个TX读取同一个Record

  2. X锁:排它锁/写锁,X LOCK不可以同时分发给多个TX,而且TX申请X LOCK的Record对象,必须没有其他的LOCK(不管是S还是X);并且TX申请成功X LOCK之后,一直到锁被释放前,当前Record都不可以分发其他锁(即不可被其他TX读写)

任何数据库的锁,都是先确定范围,再确定加锁方式的,DML的类型将直接影响到锁的效果。

1.4 RC隔离级别可能造成的GapLock

在Mysql5.7版本官方文档下,有对 间隙锁GapLock 有这样一段陈述(见下图)。

664591b4f6db01fdc762a2b16d32b5bf.jpeg

Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level to READ COMMITTED or enable the innodb_locks_unsafe_for_binlog system variable (which is now deprecated). In this case, gap locking is disabled for searches and index scans and is used only for foreign-key constraint checking and duplicate-key checking.

大意就是,间隙锁能够被直接明确禁用。比如将事务隔离改为RC或修改系统变量(innodb_locks_unsafe_for_binlog),这样能够在搜索和索引扫描禁用掉间隙锁GapLock;But,在外键约束和唯一键时会触发使用。

2、背景

  1. 一个表scan_file_licenses,

  2. 一个唯一索引uniq_index_on_task_id_and_project_id_and_file_license_source,

  3. 5个列字段(project_id、task_id、source_file_path_hash、license_hash、license_source)

00d67106ac65f64710a4abb8139ef2e9.png

3、死锁快照


9831fbd56d098f4f532c58cba8d57696.png

从腾讯云给的结论看,死锁原因是TX1(已经持有了Next_key锁)和TX2(申请某个记录锁),两者出现了锁等待,进而导致TX2被回滚了。

3.1 造成死锁的事务

3.1.1 事务A

4a066795990a9e7798431806f52b61da.png

解读

  1. 事务A是一条insert语句,目的是批量写入数据

  2. 命中了唯一索引uniq_index_on_task_id_and_project_id_and_file_license_source

  3. 向记录(space id 51 page on 204462 ... 应该是二级索引数的结点描述)申请X锁;申请成功了才能正确写入数据

3.1.2 事务B

c2ab73d8c659eb27ec97bf15a9f35550.png

解读

  • 事务B是一条insert语句,目的是批量写入数据

  • 命中了唯一索引uniq_index_on_task_id_and_project_id_and_file_license_source

  • 已经持有记录(space id 51 page on 204461 ... 应该是二级索引数的结点描述)的S锁

  • 向记录(space id 51 page on 204296 ... 应该是二级索引数的结点描述)申请X锁;只有申请成功了才能正确写入数据

3.1.3 死锁原因

bcf016210669babc5e505d702b63e1a7.jpeg

死锁原因一目了然

事务B因为在申请锁的路上,所以在本事务结束之前,是不会把已经持有S锁释放掉的;

事务A则因为申请了事务B执行路上,用GapLock赋予了周围记录S锁,导致自己申请周围记录X锁失败了。

4、优化方案

4.1 业务层面优化

4.1.1控制并发插入的数据粒度

批量插入的数据量,控制在2~5条,避免概率性出现的死锁对业务造成的影响持续扩散。

4.1.2 降低并发插入的概率

批量插入的异步线程之间,通过线程休眠的方式,既能降低并发insert操作的概率,也能降低Mysql-Server负载;

4.1.3先查后插

降低重复数据的并发插入,哪些已经持久化的数据,就过滤掉无需再插入;

4.2 数据库层面优化

4.2.1 修改索引类型

解决方案在技术上并不复杂,只需要把发生死锁的唯一索引替换成普通索引就可以了,但是要注意这种替换操作对业务的影响。

5、总结

参考了腾讯云给的一个文章

从一般的角度来考虑,这个额外的 S 锁似乎是不必要的,所以仔细搜索一下 MySQL bug 的信息,发现一个远古时代的 bug 单:Unexplainable InnoDB unique index locks on DELETE + INSERT with same values (https://bugs.mysql.com/bug.php?id=68021)中也描述了同样的问题,后来官方尝试进行了“修复”,不过之后又非常戏剧性的把这个“修复”给修复掉了:Duplicates in Unique Secondary Index Because of Fix of Bug#68021(https://bugs.mysql.com/bug.php?id=73170)。

参考文章

MySQL案例:insert死锁与唯一索引(https://cloud.tencent.com/developer/article/2017355?areaSource=&traceId=)

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

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

相关文章

Mac下通过Docker安装ElasticSearch集群

1、安装ElasticSearch 使用docker直接获取es镜像,执行命令docker pull elasticsearch:7.7.0 执行完成后,执行docker images即可看到上一步拉取的镜像。 2、创建数据挂在目录,以及配置ElasticSearch集群配置文件 创建数据文件挂载目录 mkdir -…

如何快速掌握Facebook运营+独立站运营基础?

在当今数字化时代,Facebook运营和独立站运营成为许多企业和个人创业者的关键战略。通过巧妙地结合这两个渠道,你可以有效地推广品牌、吸引目标受众并实现商业目标。本文将为你介绍如何快速掌握Facebook运营和独立站运营的基础知识,为你的业务…

微服务组件之Eureka

1、什么是Eureka,为什么要有Eureka 在传统的RPC远程调用中,管理每个服务于服务之间依赖关系复杂,管理复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等&#xf…

一文搞懂KMP算法!!!

一文搞懂KMP算法!!! 🍁什么是KMP算法?🍁什么是 next() 数组 和 前缀表?前缀表有什么作用呢最长公共前后缀如何计算前缀表 🚀 构造next数组🚀 使用next数组来做匹配 🍁什么是KMP算法…

基于SSM+Vue的旅游资源网站设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

我们不打价格战!大众的倔强

2023年即将过半,在价格战席卷市场的同时,汽车制造商必须在市场份额、销量、营收以及利润之间做出权衡。“无论如何,大众都不会参与中国市场的价格战。“本周,大众汽车首席运营官Ralf Brandstaetter表示。 这家曾经在中国市场长期占…

留学生ChatGPT的正确打开方式及推荐使用方式

ChatGPT是什么? ChatGPT可以代写论文吗? ChatGPT推荐打开方式是什么? 今天就为大家梳理一下火爆全网的ChatGPT在留学中的正确打开方式,让同学可以更好地体验ChatGPT带来的便利。 什么是Chat GPT? ChatGPT(Chat G…

Office Visio 2016安装

哈喽,大家好。今天一起学习的是Visio 2016的安装,这是一个绘制流程图的软件,用有效的绘图表达信息,比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件,便于IT和商务人员就复杂…

微信电脑版二维码( NATIVE 扫码支付)

后端代码 /** * 微信支付->扫码支付(模式二)->统一下单->微信二维码 * return */ PostMapping (value “/qrcode”) RequestLog(“微信支付二维码”) ApiOperation(“微信支付二维码”) AnonAccess public ResponseEntity wxpayPay(Validated RequestBody SysMember…

GreatSQL 8.0.32-24 今日发布

1.新增特性 1.1 SQL兼容性1.2 MGR1.3 性能优化1.4 安全 2.稳定性提升 3.其他调整 4.bug修复 5.GreatSQL VS MySQL 6.GreatSQL Release Notes GreatSQL 8.0.32-24版本发布,增加并行load data、(逻辑 & CLONE)备份加密、MGR读写节点可绑定…

MyBatis的创建和单表使用

前言: 之前我们了解到MySQL。接下来了解一下MyBatis,它不是一种数据库,那是什么呢和数据库有什么联系了? 目录 一:MyBatis的定义 二:MyBatis的创建 三:MyBatis的简单使用 3.1:准备工作 3.…

后端服务架构高性能设计之道

“N 高 N 可”,高性能、高并发、高可用、高可靠、可扩展、可维护、可用性等是后台开发耳熟能详的词了,它们中有些词在大部分情况下表达相近意思。本序列文章旨在探讨和总结后台架构设计中常用的技术和方法,并归纳成一套方法论。 前言 本文主…

视频采集到录制 - MP4生成

录制最终格式是MP4,视频流是采用H264编码流,音频是aac编码流 最终需要将两个流合并到一个文件里 采用的方案,是通过mp4v2的库,进行合并 原理很简单: 先创建文件,输入编码参数 需要创建视频流初始 也需要…

制造业在数字化时代如何应对挑战和机遇?

随着数字化时代的到来,制造业不可避免地会受到一些对应的挑战和机遇。以下是一些关键部分: 数字化转型:制造商已经采用数字技术来转变他们的运营。包括采用高级分析、自动化、人工智能 (AI) 和物联网 (IoT)。这些技术可以提高生产力、质量控制…

2.项目数仓、项目工具

项目数仓 数仓(Data Warehouse)是指用于存储和管理企业数据的一种大型数据库系统,以支持企业的决策分析活动。它采用了ETL(抽取、转化、加载)等技术来集成和清洗数据,并提供了灵活的查询和报表功能,使得分析师和决策者可以更好地理解企业的业务情况和趋势。 项目工…

基于三相坐标系状态方程的感应电动机起动动态计算(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

DataGrip使用技巧总结

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

照片怎么拼图?简单好用的拼图方法分享

照片的拼接不仅能够让我们将多张照片合成一张大图,还能够发挥我们的想象和创意,例如,我们可以将不同的照片拼接在一起,创造出一个全新的场景,或者将同一个场景的不同角度的照片拼接在一起,制作出一个完整的…

一个网站建设公司如何保障提供优质的服务

网站建设公司提供的服务是否优质,直接影响到客户的口碑,也会影响到公司的口碑。 一个好的网站建设公司,不仅会提供优质的服务,还会有专业的技术人员对客户进行跟踪服务。这是一项重要的工作,需要一个网站建设公司不断…

《神奇的连接组》读后

人类大脑被戏称为“三磅的宇宙”,或许可以从科学上解释关于“意识”的问题,大脑的神经科学可能是人类科学的最终前沿。 任何真正先进的科技,看起来都与魔法无异。 要解释大脑如何运转,单凭基因无法解释大脑为什么这样工作&#xf…