故障分析 | MySQL死锁案例分析

MySQL死锁产生的原因和解决方法 线程安全问题以及MySQL死锁产生的原因和解决方法排查方法和案例分析 阅读详情

作者:杨奇龙

网名“北在南方”,资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一 背景

死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。

本次分享的死锁案例是 更新不存在的记录加上 X GAP lock 和 insert 的意向锁冲突。希望能够对想了解死锁的朋友有所帮助。

二 案例分析

2.1 业务逻辑

业务逻辑: 业务需要并发不同数据(insert+update),首先是更新记录,如果发现更新的 affect rows 为0,然后就执行插入,如果插入失败,再执行更新。因此存在并发的情况下,两个事务都执行了更新,affect rows 为0,然后有进行并发插入相同记录的情况。

2.2 环境说明

数据库版本 8.0.30

事务隔离级别 REPEATABLE-READ

create table dl(
id int auto_increment primary key,
c1 int not null ,
c2 int not null,
c3 int not null,
unique key uc1(c1),
unique key uc2(c2));

insert into dl(c1,c2,c3) values(2,0	,2),(5,5,5);
2.3 测试用例

2.4 死锁日志
------------------------
LATEST DETECTED DEADLOCK
------------------------
*** (1) TRANSACTION:
TRANSACTION 1422661, ACTIVE 51 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1128, 3 row lock(s), undo log entries 1
MySQL thread id 3149, OS thread handle 140261085611776, query id 3267 localhost msandbox update
insert into dl(c1,c2,c3) values(3,2,2)

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 50 page no 5 n bits 72 index uc1 of table `test`.`dl` trx id 1422661 lock_mode X locks rec but not gap
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 50 page no 6 n bits 72 index uc2 of table `test`.`dl` trx id 1422661 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

*** (2) TRANSACTION:
TRANSACTION 1422664, ACTIVE 45 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1128, 2 row lock(s), undo log entries 1
MySQL thread id 3152, OS thread handle 140261086668544, query id 3268 localhost msandbox update
insert into dl(c1,c2,c3) values(3,2,2)

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 50 page no 6 n bits 72 index uc2 of table `test`.`dl` trx id 1422664 lock_mode X locks gap before rec
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 50 page no 5 n bits 72 index uc1 of table `test`.`dl` trx id 1422664 lock mode S waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

*** WE ROLL BACK TRANSACTION (2)
2.5 死锁分析
  1. sess1 在 T3 时刻执行了更新,affect rows 为0,在c2的(2,5) 区间中加了X,GAP锁。

  1. sess2 在 T4 时刻执行了更新,affect rows 为0,同样在在c2的(0,3)区间中加了GAP锁 lock_mode X locks gap before rec,GAP 锁和GAP 锁相互兼容,因此 sess1 和 sess2 不会发生等待。

  1. sess1 在 T5 时刻执行了插入,由于插入记录c2 =2 的时候需要申请插入意向锁(insert intention lock),而insert intention lock锁和已存在的 (0,3) 的 lock_mode X locks gap before rec insert intention waiting是冲突的,也就是sess1 需要等待sess2 在 T4 持有的GAP X锁,发生了等待.

  1. sess2 在 T6 时刻执行了插入,由于插入的时候需要申请插入意向锁(insert intention lock),同样需要等待Sess1 在 T3 持有的GAP锁,两个会话循环等待对方释放锁,因此导致死锁。

感兴趣的朋友可以自己 做测试,每一步操作 都打印 show engine innodb status 查看当前事务的锁等待事件。 或者执行 SQL 查询当前事务持有或者等待的锁
select ENGINE_TRANSACTION_ID, index_name, lock_type, lock_mode, LOCK_STATUS, lock_data from performance_schema.data_locks;

2.6 如何解决

将update + insert 合并为 insert on duplicate key 的方式,避免同一个事务申请多个锁。

小结

敲黑板 ,重点: 死锁是因为不同事务对表记录加锁的顺序不一致导致相互等待对方持有的锁导致的。大家在分析死锁的时候能基于该原则去分析理清业务的sql 逻辑和执行顺序,基本上都能解决大部分的问题场景。

另外文章的最后我们再次复习一下 MySQL 的加几个基本原则,方便大家后面遇到死锁案例进行分析:

原则 1:加锁的基本单位是 next-key lock。

原则 2:查找过程中访问到的对象才会加锁。

优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。

优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。

一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。

在读提交隔离级别下还有一个优化,即:语句执行过程中加上的行锁,在语句执行完成后,就要把“不满足条件的行”上的行锁直接释放了,不需要等到事务提交

MySQL死锁案例分:先delete,再insert,导致死锁 session1 已获取到IX锁,gap锁, 等待rec insert intention(插入意向锁), session1, session2 都在等待插入意向锁, 插入意向锁与gap锁冲突,双方都没有释放gap锁,又都在等待插入意向锁,死锁发生。或独占锁,对记录加了排他锁之后,只有拥有该锁的事务可以读取和修改,其他事务都不可以读取和修改,并且同一时间只能有一个事务加写锁。加了读锁的记录,所有的事务都可以读取,但是不能修改,并且可同时有多个事务对记录加读锁。 阅读详情

相关推荐

STM32F407+HAL库+W5500实现TCP通讯 个人项目总结

推荐阅读此博客 cv即可成功首先需要一个可以进行串口调试的工程,方便进行调试。1.在W5500官网移植库文件重点是Ethernet这个文件夹将里面的 socket.c,socket.h,wizchip_conf.c,wizchip_conf.h,还有根据W5500文件夹里的w5500.c和w5500.h移植到自己的工程里面。然后再创建一个.c和.h文件 我的叫w5500_port_hal.c 和w5500_port_hal.h 记得将.h文件链接到工程里。

a234abr的博客 2246

Mysql发生死锁的原因,已经解决方法详解

数据库的死锁是指不同的事务在获取资源时相互等待,导致无法继续执行的情况。MySQL中可能发生死锁的情况包括事务同时更新多个表、事务嵌套、索引顺序不一致以及不同事务同时更新相同的索引等。

LoveSummer 5159

Win10 Rational Rose 安装教程

在此教程中我们需要四个文件,点此下载[提取码:ig33] 其中第一个为2007的安装包,第二个为破解文件 前言 很多小伙伴反应说会出现几天后就到期的问题,包括我也出现了该问题,如果你已在其他地方安装好了文件且破解成功,且但几天后到期,如果可以使用更改时间的方式打开,那么可以跳过接下来的教程,直接看第三节,我们采用批处理的形式一键完成从修改时间到打开最后改回来的方法解决此问题 一、安装软件 解压缩两个安装包,进入 Rational Rose文件夹 选择setup.exe开始安装 按照图示依次点击

CoderJiang 2万+

MySQL死锁:原因、检测与解决方案深入解析

死锁是指两个或更多的事务在执行过程中,因争夺资源而造成的一种相互等待的现象。每个事务都持有一个资源并等待获取另一个事务已占有的资源,从而形成了一个循环等待的情况。除非有外部干预,否则这些事务都将无法向前推进。死锁是数据库并发控制中的一个重要问题,需要管理员和开发者共同关注和解决。通过深入了解死锁的产生原因、掌握有效的检测方法和制定合理的解决方案,可以最大程度地减少死锁对系统性能和稳定性的影响。在处理死锁问题时,需要综合考虑事务的并发性、隔离性、一致性和持久性等多个方面,以达到最佳的系统性能和数据安全性。

码到三十五 3万+

Zotero搭配CNKI.js插件:一键批量下载知网文献的完整教程(附常见问题解决)

本文提供Zotero搭配CNKI.js插件实现知网文献批量下载的完整教程。详细介绍了从环境准备、插件安装到实战操作的全流程,并针对常见问题提供解决方案,旨在帮助科研人员高效构建自动化文献管理工作流,显著提升文献收集与整理效率。

e4f5g6h7的博客 1198

揭秘个人开发者接支付宝的‘野路子’:不用企业资质,用Python模拟扫码转账与回调监听

本文探讨了个人开发者如何通过Python模拟支付宝扫码转账与回调监听的技术实现,解析了支付宝URL协议格式,并设计了本地化的支付状态监听方案。文章强调该方法仅用于技术研究,实际应用需遵守支付宝官方接口和金融合规要求。

weixin_30736301的博客 407

mysql数据库死锁原因分析

mysql数据库死锁原因分析

jiligugaeg的博客 2104

SAP SM30数据维护实战:条件筛选与动态校验的实现技巧

本文详细介绍了SAP SM30数据维护的实战技巧,重点讲解如何通过条件筛选实现精准数据查取,以及利用表维护生成器事件实现动态数据检查与校验。文章提供了从基础视图创建到高级事件编程的完整流程,包括调用函数VIEW_MAINTENANCE_CALL传递筛选条件,以及在NEW_DATA和CHANGE_SAVE事件中编写业务规则校验逻辑,帮助开发者提升SM30的管控能力与数据质量。

q9w8e7r6t5的博客 520

MySQL 故障案例分析:从死锁到数据丢失的全面诊断指南

MySQL故障诊断与处理指南 本文系统分析了MySQL生产环境中的常见故障类型,重点探讨了死锁故障的排查与解决方案。 主要内容 MySQL故障全景分析: 性能故障(死锁阻塞、主从延迟等) 可用性故障(实例宕机、资源耗尽等) 数据故障(数据丢失、不一致等) 提供了故障严重程度评估矩阵 死锁案例深度解析: 通过电商订单系统案例还原死锁发生场景 详细分析死锁日志和诊断过程 提供多种解决方案: 应急处理(终止阻塞事务) 根本解决(统一操作顺序、减小事务粒度) 应用层优化(重试机制) 实用工具: 关键监控命令(SHO

qq_43414012的博客 1114

ValueError:Using a `device_map`, `tp_plan`, `torch.device` context manager or setting `torch.set解决方案

本文主要介绍了ValueError:Using a `device_map`, `tp_plan`, `torch.device` context manager or setting 'torch.set_default_device(device)` requires `accelerate`解决方案,希望能对使用transformers的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

2024全国村级行政边界数据

五级行政区划:村边界数据产品涵盖五级行政区划:(一级行政区)省级行政区共31个其中:(台湾、香港、澳门除外);(二级行政区)地级行政区共334个其中:7个地区、3个盟、30个自治州、294个地级市;(三级行政区)县级行政区共2851个其中:1355个县、117个自治县、49个旗、3个自治旗、363个县级市、962个市辖区、1个林区、1个特区;(四级行政区)乡级行政区共40497个其中:11626个乡、1034个民族乡、20117个镇、7566个街道、151个苏木、1个民族苏木、2个县辖区公所;

J_Giser的博客 3226

故障分析 | MySQL Insert 加锁与死锁分析

原创:胡呈清 前 言 本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。 爱可生开源社区持续运营维护的小目标: 每周至少推送一篇高质量技术文...

chiweiliu4439的博客 448

具身智能 | 从具身智能出发谈多传感器融合技术

多传感器融合感知是具身智能系统突破“感知—认知—行动”闭环的核心使能技术。本文从具身智能的视角出发,对多传感器融合技术进行系统综述。首先阐述了具身智能对多传感器融合提出的独特需求,包括异构感知集成、跨模态语义对齐和实时闭环决策。其次,构建了多层级融合技术分类框架,从数据层融合、特征层融合、决策层融合、时序融合到多模态大语言模型(MLLM)融合,逐层梳理主流方法与演进脉络。在此基础上,分析了面向具身智能的通用融合架构设计,涵盖了感知—推理—执行三层架构及其关键组件。

尘世冰封的专栏 310

故障分析 | 从 Insert 并发死锁分析 Insert 加锁源码逻辑

死锁,作为数据库一个常见的并发问题。此类问题:1.触发原因往往与应用的逻辑相关,参与的事务可能是两个、三个、甚至更多;2.由于不同数据库的锁实现机制几乎完全不同、实现逻辑复杂,还存在多种锁类型;3.数据库发生死锁后,会立即终止部分事务,事后无法看到死锁前的等待状态。即,死锁问题具有业务关联、机制复杂、类型多样等特点,导致当数据库发生死锁问题时,不是那么容易分析。

ActionTech的博客 1789

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

insert mysql 不同session 锁_故障分析 | MySQL Insert 加锁与死锁分析

原创:胡呈清前 言本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。爱可生开源社区持续运营维护的小目标:每周至少推送一篇高质量技术文章每月研发团队发布开源组件新版每年1024开源一款企业级组件2019年至少25场社区活动欢迎大家持续关注~ 在我们尝试回答这个问题前,一定要注意前提...

weixin_36121354的博客 142

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

insert mysql lock_故障分析 | MySQL Insert 加锁与死锁分析

前 言本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。爱可生开源社区持续运营维护的小目标:每周至少推送一篇高质量技术文章每月研发团队发布开源组件新版每年1024开源一款企业级组件2019年至少25场社区活动欢迎大家持续关注~在我们尝试回答这个问题前,一定要注意前提条件,如果你看过...

weixin_39779467的博客 425

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL 数据库高负载故障分析

转载来自:https://www.2cto.com/database/201701/586258.html 紧急处理 第一: 先限制Innodb的并发处理.如果innodb_thread_concurrency = 0 可以先改成 16或是64 看机器压力,如果 非常大,先改成16让机器的压力下来,然后慢慢增达,适应自已的业务. 处理方法: 1 set gl...

任飞 544

insert into select from 部分字段插入_MySQL的故障分析,Insert 加锁与死锁分析-爱可生

前 言本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。在我们尝试回答这个问题前,一定要注意前提条件,如果你看过登博的《MySQL 加锁处理》,一定知道前提不同答案也就不同,如果还没看过建议你去看一下,链接:http://hedengcheng.com/?p=771那么这个问题缺少哪...

weixin_39856803的博客 855

双重检测加锁为什么要使用volitail_故障分析 | MySQL Insert 加锁与死锁分析

原创: 胡呈清 爱可生开源社区 4月1日前 言本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。爱可生开源社区持续运营维护的小目标:每周至少推送一篇高质量技术文章每月研发团队发布开源组件新版每年1024开源一款企业级组件2019年至少25场社区活动欢迎大家持续关注~在我们尝试回答这个...

weixin_40008644的博客 104

multiprocessing.manager管理的对象需要加锁吗_故障分析 | MySQL Insert 加锁与死锁分析...

前 言本文是由爱可生运维团队出品的「MySQL专栏」系列文章,内容来自于运维团队一线实战经验,涵盖MySQL各种特性的实践,优化案例,数据库架构,HA,监控等,有扫雷功效。爱可生开源社区持续运营维护的小目标:每周至少推送一篇高质量技术文章每月研发团队发布开源组件新版每年1024开源一款企业级组件2019年至少25场社区活动欢迎大家持续关注~在我们尝试回答这个问题前,一定要注意前提条件,...

weixin_39673704的博客 148

故障分析 | 从库并行回放死锁问题分析

作者:林靖华 爱可生服务团队成员,负责处理客户在MySQL日常运维中遇到的问题;擅长处理备份相关的问题,对数据库相关技术有浓厚的兴趣,喜欢钻研各种问题。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 一、背景 生产环境有一套 MySQL 集群,架构为一主两从,其中一个从库设置了延迟复制,延迟时间为 1 天。 某天在巡检实例时,发现这个延迟从库延迟时间已经超过 1 天,且延迟不停的在增加,在监控上查看数据库状态是正常的,其他两台实例也没有出现问题。 登.

ActionTech的博客 518

update 语句会发生死锁?

90% 的程序员都认为 innodb 是行级锁,但实际上使用不当,它也是表级锁! 看过我博客的网友都知道,我之前写过一篇文章《 InnoDB 的 select 行锁还是表锁?》。拯救过不少人,今天我们再来一次大拯救! 最近生产上的 MySQL 数据库,是不是的就来一次 DeadLock,其中我做了故障排查,昨天做了相关的升级,导致昨天非常的忙,很多网友加我好友,都没有及时回应,直到晚上升级结束,我在群里做了相关的解释! 截了一段错误日志信息如下: 其中涉及到的更新语句如下: 很奇妙吧,执行一条 update

huaishuming的专栏 2864

新特性解读 | MySQL 8.0:死锁日志改进

作者:胡呈清 爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 重要改进 MySQL8.0 的死锁日志可以看到事务1持有的锁信息了: 这对我们分析死锁无疑是个很好的帮助,而在 MySQL5.7 是没有这个信息的,一直饱受诟病: 注意事项 但是这在某些情况下可能会产生一些误会,比如事务1持有锁和等待锁是.

ActionTech的博客 792
上一篇: 分布式 | 令人头疼的堆外内存泄露怎么排查?
下一篇: 故障分析 | MySQL死锁案例分析
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值