MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查

MySQL 故障排查:从 `SHOW PROCESSLIST` 到死锁检测的完整流程 基础排查:通过 SHOW PROCESSLIST 快速识别慢查询、锁等待等异常会话状态,结合 information_schema.innodb_locks 分析阻塞源头。 锁机制解析:深入理解InnoDB行锁(S/X锁)、间隙锁等机制,利用 SHOW ENGINE INNODB STATUS 和错误日志捕获死锁详情,优化事务加锁顺序与索引设计。 查询优化:启用慢查询日志,结合 EXPLAIN 分析执行计划,避免全表扫描,缩短事务时间。 阅读详情

MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查

今天要分享的是在生产环境中出现的一次算得上比较诡异的死锁事件, 不过庆幸的是没有产生较大的业务损失.

1. 背景

某日线上产生了多封报警邮件, 邮件内容均如下, 由于生产环境这里简化了表格结构如下

CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称',
  `age` int(3) NOT NULL COMMENT '年龄',
  `school` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '学校',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `name_age`(`name`, age) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Compact;

报警邮件内容如下

### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
### The error occurred while setting parameters
### SQL: update student SET school = "清华" WHERE ( name = '小明' )
### Cause: com.mysql.jdbc.exceptions.jdbc4.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.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

2. 代码还原

根据报警邮件中的日志信息, 我们针对代码位置进行定位, 代码逻辑如下, 这里依旧简化了代码

业务1

    开启事务

    .... 业务普通查询

    for ( ... 循环条件 ) {

        .... Student对象构建

        .... 将构建好的对象 Student 进行insert入库

        .... 将构建好的对象 Student 发送mq进行异步处理

        .... 业务剩余条件

    }

   .... 业务剩余条件

   提交事务

针对异步处理的代码逻辑如下

业务2

    .... 接受到消息Student

    .... 计算需要变更的参数

    .... 将计算好的参数 赋值给Student `school`字段

    .... 将Student 在表中的数据进行更新(这里产生了死锁)

3. 问题分析

初步猜测, 由于业务1中是在开启事务后循环插入数据, 最后在提交事务的, 那么异步发送出的消息也就是业务2在执行更新的时候都会由于业务1的事务未提交而一直出于blocked, 可能在这blocked期间产生了死锁, 但是死锁产生的原理还是没有整明白, 且不是100%必现, 我们针对问题进行深层次的分析.

追踪MYSQL innodb 状态

首先我们进去mysql, 执行

show engine innodb status;

获取信息非常多, 提取LATEST DETECTED DEADLOCK信息, 也就是最后一次死锁的信息如下

------------------------
LATEST DETECTED DEADLOCK
------------------------
191028 13:33:14
*** (1) TRANSACTION:
TRANSACTION 2656E7, ACTIVE 1 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 879805, OS thread handle 0x7f8d26308700, query id 3761780 XXXXXXXXXXXXX root Updating
update student SET school = "清华" WHERE ( name = '小明' )
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 1362 n bits 376 index `name_age` of table `数据库1`.`student` trx id 2656E7 lock_mode X waiting
XXXXXX

*** (2) TRANSACTION:
TRANSACTION 2656E2, ACTIVE 1 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 3
MySQL thread id 879796, OS thread handle 0x7f8d261c3700, query id 3761781 XXXXXXXXXXXXX root update
insert into student (XXXXXXXXXXXXXXXXXXXXXXXX)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 1362 n bits 376 index `name_age` of table `数据库1`.`student` trx id 2656E2 lock_mode X locks rec but not gap
XXXXXX

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 1362 n bits 376 index `name_age` of table `数据库1`.`student` trx id 2656E2 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 292 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
XXXXXX

*** WE ROLL BACK TRANSACTION (1)
------------

信息概念储备

为了能解读这里的日志信息,我们需要对MYSQL的锁的知识进行说明

锁模式解读 lock_mode

锁模式在 MySQL 的源码中定义如下:

/* Basic lock modes */
enum lock_mode {
    LOCK_IS = 0, /* intention shared */
    LOCK_IX,    /* intention exclusive */
    LOCK_S,     /* shared */
    LOCK_X,     /* exclusive */
    LOCK_AUTO_INC,  /* locks the auto-inc counter of a table in an exclusive mode*/
    ...
};

LOCK_IS:读意向锁 LOCK_IX:写意向锁 LOCK_S:读锁 LOCK_X:写锁 LOCK_AUTO_INC:自增锁

篇幅有限这里解释下最普通的读写锁 LOCK_S与LOCK_X:
读锁, 又称共享锁(Share locks,简称 S 锁), 加了读锁的记录,所有的事务都可以读取, 但是不能修改,并且可同时有多个事务对记录加读锁.
写锁, 又称排他锁(Exclusive locks,简称 X 锁), 或独占锁,对记录加了排他锁之后, 只有拥有该锁的事务可以读取和修改, 其他事务都不可以读取和修改, 并且同一时间只能有一个事务加写锁.

Innodb下行锁类型

Innodb行锁类型解释

记录锁(Record Locks), 行级锁, 也就是所谓的行锁,锁定的是索引记录,行锁就是索引记录锁. 间隙锁(Gap Locks),行级锁,RR特有, gap锁加在指定索引值前面的间隙,通常是对第一个不满足条件的索引值加gap锁。 下一键锁(Next-Key Locks),行级锁,RR特有, 是特殊的gap锁,是索引值record锁和gap锁的合体。

特殊锁

插入意向锁(Insert Intention Locks),行级锁,RR特有, 是一种特殊的间隙锁(所以有的地方把它简写成 II GAP),这个锁表示插入的意向,只有在 INSERT 的时候才会有这个锁。注意,这个锁虽然也叫意向锁,本质依旧是间隙锁

信息解读

在事务(1)中, 执行SQL为更新操作, update student SET school = “清华” WHERE ( name = ‘小明’ ) 等待锁 name对应索引行值为name_age的写锁 也就是lock_mode X

在事务(2)中, 执行SQL为插入操作, insert into student (XXXXXXXXXXXXXXXXXXXXXXXX)
持有锁 HOLDS THE LOCK(S): name对应索引行值为name_age的记录锁写锁 lock_mode X locks rec but not gap
等待锁 WAITING FOR THIS LOCK TO BE GRANTED: 在插入意向锁之前等待间隙锁写锁释放 及lock_mode X locks gap before rec insert intention waiting

最终由于事务(1)权重小我们进行了回滚操作

4. 问题定位

这里我们事先在数据库中先插入两条现有数据

insert student(name, age, school) values("test1", 10, "value1");
insert student(name, age, school) values("test10", 10, "value2");

模拟线上数据库执行操作

这里分别列举了2种情况, 去描述数据中的执行操作
image.png

4.1 对比结果

为什么明明一样的执行顺序, 在name字段值不一样的情况下结果不一致呢?

  • 核心概念1: Next-key Lock优化机制, 当查询的索引含有唯一属性时 Next-Key Lock进行优化,将其降级为Record Lock
  • 核心概念2: Next-key Lock加锁顺序分为两步, 第一步加间隙锁, 第二步加行锁
  • 核心概念3: 插入意向锁(Insert Intention Locks)是一种特殊的间隙锁, 在插入时判断是否有和插入意向锁冲突的锁, 如果有, 加插入意向锁, 进入锁等待;如果没有, 直接写数据, 不加任何锁

image.png

4.2 解读试验结果

当建表student时, 默认数据都如下:

MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查

情况1:

  • 事务1: 执行SQL插入第一条 name = test15时 判断是否和插入意向锁{(test10, 10) ~ (+∞)}存在冲突, 没有那么直接插入数据, 获得(test15, 10)这一行的写锁
  • 事务2: 执行SQL更新 修改name = test15的记录shcool为’XX’, 尝试获取Next-key, 此时由于where条件中只有name并不满足唯一索引条件不进行优化, 先尝试获取间隙锁{(test10, 10) ~ (test15, 10)}获取成功, 获取(test15, 10)这行的行锁时发现被事务1占住那么blocked住
  • 事务1: 执行SQL插入第二条 name = test16时 判断是否和插入意向锁{(test15, 10) ~ (+∞)}存在冲突, 没有那么直接插入数据, 获得(test16, 10)这一行的写锁
  • 事务3执行SQL更新 修改name = test16的记录 等同与事务2 获得{(test15, 10) ~ ((+∞))}间隙锁, 被(test16, 10)行锁blocked住
  • 事务1: 提交释放行锁 事务2 3: 获得行锁执行成功

情况2

  • 事务1: 执行SQL插入第一条 name = test15时 判断是否和插入意向锁{(test10, 10) ~ (+∞)}存在冲突, 没有那么直接插入数据, 获得(test15, 10)这一行的写锁
  • 事务2: 执行SQL更新 修改name = test15的记录shcool为’XX’, 尝试获取Next-key, 此时由于where条件中只有name并不满足唯一索引条件不进行优化, 先尝试获取间隙锁{(test10, 10) ~ (test15, 10)}获取成功, 获取(test15, 10)这行的行锁时发现被事务1占住那么blocked住
  • 事务1: 执行SQL插入第二条 name = test14时 判断是否和插入意向锁{(test10, 10) ~ (test15, 10)}存在冲突, 此时发现事务2占有间隙锁, 那么需要加插入意向锁, 此时进入锁等待, Innodb发现事务1与事务2存在死锁关系, 由于事务2权重小直接回滚释放间隙锁, 事务1加插入意向锁成功, 插入数据(test14, 10)
  • 事务3: 执行SQL更新 修改name = test14记录, 尝试获取Next-key, 此时由于where条件中只有name并不满足唯一索引条件不进行优化, 先尝试获取间隙锁{(test10, 10) ~ (test14, 10)}获取成功, 获取(test14, 10)这行的行锁时发现被事务1占住那么blocked住
  • 事务1: 提交释放行锁
  • 事务3: 获得行锁执行成功

5.结论

在使用where条件时, 由于没有使用联合唯一索引, 导致了Next-key Lock没有进行优化降级为Record Lock, Next-key Lock的加锁顺序分为两步, 第一步加间隙锁, 第二步加行锁, 在成功执行完第一步后, bolcked在第二步, 导致了与之后的插入意向锁产生了冲突, 从而造成两个事务相互等待产生了死锁。

NHANES更新数据后,权重计算方式也更新了 官网说明在此:如果你比我还懒,我下载了几个说明文件。2021年8月至2023年8月的总样本量与之前的2年周期相似。然而,。特别是,与之前包括过度抽样的周期相比,非西班牙裔白人的样本量较高,而非西班牙裔黑人的样本量较低。此外,60岁及以上人群的样本量较高,而年轻群体的样本量较低。子组的估计值可能具有较低的精确度,因此,检测组间差异的统计能力可能较低。此外,年龄和种族/西班牙裔亚组(尤其是儿童和青少年年龄组)的估计值可能会显示意想不到的模式。 阅读详情

相关推荐

AFSim 2.9中文手册实战指南:从安装到高级功能详解(附B站视频链接)

本文详细介绍了AFSim 2.9的安装配置、基础功能操作和高级功能应用,帮助用户快速掌握这款强大的仿真平台。从系统要求检查到多体动力学仿真,再到性能优化技巧,全面解析AFSim 2.9的使用方法,适合初学者和进阶用户参考。

weixin_30892037的博客 569

mysql死锁

mysql死锁: 1、查询是否锁表 show OPEN TABLES where In_use > 0;   2、查询进程     show processlist   查询到相对应的进程===然后 kill    id 相同表, a命令行 mysql> set autocommit=off ; Query OK, 0 rows affected mysql> u

我家猫叫奥利奥 1084

Qt QWebEngine实战:手把手教你将Vue3/React前端项目嵌入C++桌面程序

本文详细介绍了如何利用Qt的QWebEngine模块将Vue3/React前端项目无缝嵌入C++桌面程序,实现现代前端框架与原生C++的深度整合。通过环境准备、项目架构设计、前端适配、Qt端集成、双向通信建立及性能优化等步骤,开发者可以高效构建兼具Web灵活性和本地系统能力的混合应用。

weixin_28736355的博客 390

MySQL并发insert导致的dead lock解决方法

线上某业务最近经常会出现dead lock,相关信息如下: 2016-06-15 20:28:257f72c0043700InnoDB: transactions deadlock detected, dumping detailed information. 2016-06-15 20:28:25 7f72c0043700 *** (1) TRANSACTION: TRANSACTION 151506716, ACTIVE 30 sec inserting mysql tables in...

hannnnn_的博客 5266

告别手动群发!用IDA Pro和CE搞定企业微信4.1.38.6011的HOOK开发(附完整代码)

本文详细介绍了如何利用IDA Pro和Cheat Engine进行企业微信4.1.38.6011的HOOK开发,实现自动化群发功能。从逆向工程环境配置、关键函数定位到HOOK框架设计,提供完整代码示例,帮助企业提升运营效率。

weixin_42533120的博客 480

代码详解——Transformer

对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。当 Decoder 的输入矩阵和 Mask 矩阵输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。然后判断是否传入的mask, 如果有mask (mask参数值不为None),则把mask为0的位置,将对应位置的attn的值设为无穷小的负数。可以发现得到的输出和输入的K,Q,V的大小相同。

zyw2002的博客 7218

mysql死锁的例子_MySQL数据库的一次死锁实例分析

mysql 死锁

C18298182575的博客 1510

6 赫斯曼网管软件industrial hivision用户管理

文章目录前言一、打开Industrial HiVision服务器二、在用户管理界面添加策略三、使用可选策略四、接受策略总结 前言 安装 Industrial HiVision 后,所有人都能广泛使用程序。安全起见,请进行相 关配置,对访问权限进行限制。 本文主要介绍用户管理基于某种角色模型。在访问角色中定义角色名称,通过分配访问权限给这些角色分配角色功能。例如,给管理人员自然要分配可用的权限,而观察员尽管可以登录,但没有能够进行更改的权限。Industrial HiVision 提供以下访问角色: 

t98746194的博客 1381

MYSQL 分享一次生产环境的死锁事故原因和排查过程

1. 背景 某日线上产生了多封报警邮件, 邮件内容均如下, 由于生产环境这里简化了表格结构如下 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '名称', `age` int(3) NOT NULL COMMENT '年龄', `sch

m0_50180963的博客 1615

高效爬取懂车帝车型数据:从静态解析到动态反爬实战

本文详细解析了如何高效爬取懂车帝车型数据,从静态HTML解析到动态接口反爬的完整实战路径。文章重点介绍了使用浏览器开发者工具定位数据、应对CSS混淆与参数加密等反爬策略,并提供了整合静态与动态抓取逻辑的Python代码示例,帮助开发者稳健地获取结构化车型信息。

wind6的博客 937

【33】软考软件设计师——算法题(二):贪心法与回溯法深度精讲|第4题进阶满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第33篇,承接第32篇分治法与动态规划,聚焦**下午第4题算法大题进阶核心**,详解贪心法与回溯法两大高频难点算法。全文超4000字深度拆解贪心法核心原理、贪心选择性质、局部最优推全局最优的底层逻辑,厘清贪心算法适用边界与经典误区;深挖回溯法深度优先遍历思想、递归回溯三步流程、可行性剪枝与最优性剪枝两大核心技巧;全覆盖活动选择、零钱兑换、01背包贪心禁区、八皇后、全排列等软考必考经典题型;配套标准化算法框架代码、考场填空模板、剪枝优化实操案例

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 442

mysql 数据库 死锁_Mysql数据库出现死锁的情况(一)

在临近上线之前,我们系统做了一次压力测试,发现有一个接口在高并发情况下会出现一个死锁的情况。。首先申明…不是我写的,我只是帮忙排查下。随着对Mysql锁的深入了解,于是就准备写几篇文章来记录下Mysql各种事物和索引的情况下出现死锁的情况。今天就介绍下在并发插入的情况下,哪几种情况会出现死锁:INNODB下的各种锁在介绍锁的时候只会介绍跟本节相关的锁,而且只会讲述大概是什么,至于锁的更加详细的讲解...

weixin_36269396的博客 1044

Unity 横版游戏开发天花板?状态机、联机同步与横版动作游戏架构全都有

在 Unity 横版动作游戏开发领域,最耗时间的往往不是角色移动,而是整套“可扩展架构”的搭建。包括角色状态管理、敌人 AI、武器系统、关卡编辑器、联机同步、输入适配、UI 与存档系统等。2D Action Platformer Kit 的核心价值,并不只是“提供素材”,而是它已经帮开发者搭好了一整套适用于横版动作游戏的底层框架。

2403_88403568的博客 425

MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查!

今天要分享的是在生产环境中出现的一次算得上比较诡异的死锁事件, 不过庆幸的是没有产生较大的业务损失.

mf97532的博客 1666

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大型高并发系统中,10大MySQL 生产事故

在大型高并发系统中,MySQL常见生产事故主要包括数据库连接数耗尽、慢查询导致数据库卡死、死锁、主从延迟严重、磁盘空间耗尽、InnoDB Buffer Pool不足、大事务阻塞写入与读取、数据库主库宕机、半同步复制丢数据风险以及热点行争用严重等问题。这些事故通常由于连接池配置不合理、未命中索引、并发下多事务交叉锁定资源、主库写入压力过大、表数据量暴增、Buffer Pool配置过小、忘记提交事务、硬件故障、半同步配置不当或单行数据被高频更新等原因引起。解决方案涉及增加max_connections、使用连接

weixin_43991457的博客 2539

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

记一次 MySQL 死锁事故的完整排查过程

抓现场,看两个事务各自持有什么锁、在等什么锁还原到业务代码,找出加锁顺序不一致的地方统一加锁顺序,或缩短事务持锁时间同一组表,全项目统一操作顺序,这条规则写进 CodeReview checklist。

tiao_01的博客 245

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySQL死锁排查笔记

MySQL发生死锁时是谁与谁在争夺什么呢?跟我一起来探秘吧

醉鱼的博客 774

如何解决MySQL死锁(看懂MySQL锁日志)

有时候系统在生产运行着,会突然爆出这个时候每个人都会很紧张,因为死锁会影响DB性能,严重时甚至拖垮整个系统。在实际的环境中,很多服务会共用一个数据库,一旦数据库挂了,基本就是P0事故。那么,死锁发生时,我们如何定位到死锁发生的SQL?

马不腾的博客 5399

一次慢改表引发的线上死锁事故复盘

摘要(149字) 一次线上慢改表操作引发死锁事故的复盘。在执行pt-online-schema-change时,由于未提前检查长事务,导致MDL锁冲突:长事务持有读锁,DDL操作需要写锁而阻塞,最终影响业务请求响应。事故持续约50秒,通过终止异常事务恢复。核心教训:在线DDL仍依赖metadata lock,必须建立标准化流程,包括前置检查(长事务、锁等待)、执行监控和事后验证。后续需加强长事务监控、完善checklist并在低峰期执行变更。

月光晒了很凉快的博客 444

MySQL死锁:排查与优化全流程​

MySQL死锁问题通常表现为事务回滚、接口失败和TPS抖动。死锁的成因包括并发更新同一资源、更新顺序不一致、范围查询锁冲突、大事务锁资源多以及外键隐式锁等。排查死锁的步骤包括查看死锁信息、检查表与索引的合理性、分析长事务与锁等待情况。优化和解决死锁的方案包括统一更新顺序、最小化锁定粒度、缩短事务时间、避免范围锁、使用Redis缓存和队列异步处理、应用乐观锁控制以及实现应用幂等重试。生产环境中,可以通过监控死锁次数、活跃事务数、锁等待数和SQL慢查询来预防死锁。总结来说,避免死锁的关键在于统一锁定顺序、保持事

weixin_43991457的博客 477

微服务环境差异引发的生产事故排查与解决方案

在分布式系统和微服务架构中,环境差异是导致生产事故的常见原因之一。理解环境一致性的重要性对于系统稳定性至关重要。环境差异通常涉及中间件版本、线程池配置、网络拓扑等多个方面,这些差异在测试环境中可能难以发现,但在生产环境高并发场景下会引发连锁反应。通过监控系统、日志分析和实时诊断工具(如Arthas),可以快速定位问题根源。本文通过一个真实案例,详细解析了如何排查和解决由环境差异引发的生产事故,并分享了环境一致性检查清单和微服务监控增强方案,帮助开发者避免类似问题。

weixin_30414305的博客 348

缺索引引发的“蝴蝶效应“:一次死锁事故的深度复盘 [特殊字符]

数据库死锁问题分析摘要 某晚23:40,系统出现P1级数据库死锁报警,涉及一条简单的UPDATE语句。通过分析MySQL死锁日志发现:两个事务因竞争同一条记录而陷入死锁状态。根本原因是事务1的查询条件(user_id+state)缺少合适索引,导致全表扫描,引发锁冲突。事务2则持有主键锁但等待二级索引锁。最终MySQL选择回滚事务2解决死锁。问题暴露了索引缺失导致的全表扫描风险,建议为user_id和state字段创建联合索引,避免类似死锁问题。

fengquan8866的博客 651

【八股消消乐】如何解决SQL线上死锁事故

💬技术栈:MySQL、锁 🔍简历内容:熟悉MySQL行锁实现算法,如record lock、gap lock、next-key lock,熟悉预防死锁的常用手段。 🚩面试问: (1)项目初期没有实现读写表分离,都是基于一个主库完成读写操作,业务量逐渐增大后,数据库出现了异常报警。 (2)根据日志分析,作为`幂等性校验的一张表`经常出现死锁异常,怀疑索引导致的死锁问题。 (3)订单在做幂等性校验时,先是通过订单号检查订单是否存在,如果不存在则新增订单记录。 (4)分析可能的原因并给出解决方案。

文艺倾年的博客 844

MYSQL的社死----死锁

在MySQL5.7版本中,也可以使用sys.innodb_lock_waits试图查看,但是在MySQL8.0中,该视图连接查询的表不同(把之前版本中使用的information_schema.innodb_locks表和information_schema.innodb_lock_waits)表替换为了performance_schema.data_locks和performance_schema.data_lock_waits)表。当然了,我们最好的策略那就是在自己的业务上预防死锁的出现。

sanylove的博客 1847

MySQL 间隙锁死锁复现:一次凌晨告警的完整排查(附可运行 SQL)

MySQL间隙锁死锁排查与复现:一次非唯一索引操作引发的循环等待问题 摘要:本文通过一个凌晨订单服务的死锁告警案例,深入分析了MySQL间隙锁(Gap Lock)导致的两个事务死锁现象。当两个事务分别更新非唯一索引上的不同行时,由于各自持有间隙锁并试图在对方的锁定区间插入数据,最终形成循环等待而死锁。文章详细解析了InnoDB的三种行级锁(Record Lock、Gap Lock、Next-Key Lock)机制,并提供了一个5秒即可复现的最小案例(MySQL 8.0+验证通过),同时提出了使用唯一索引替代

qq_38669579的博客 357
上一篇: 学校门口保安啃完这份524页“Java中高级学习笔记”都能拿13k了,你还不行动起来?
下一篇: 一文透析SpringCloud,关于Bus消息总线,总算梳理清楚了
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值