【MySQL】死锁案例之三
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,一 前言死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。二 背景知识2.1
千家信息网最后更新 2025年11月08日【MySQL】死锁案例之三一 前言
死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。
二 背景知识
2.1 insert 锁机制
在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略。我们先来看看官方定义:
3.3 死锁日志
我们从时间线维度分析:
T2 insert into t7(id,a) values(26,10)语句insert 成功,持有a=10 的X 行锁(X locks rec but not gap)
T1 insert into t7(id,a) values(30,10),因为T2 的第一条insert已经插入a=10的记录,T1的 insert a=10 则发生唯一约束冲突,需要申请对冲突的唯一索引加上S Next-key Lock (也即是 lock mode S waiting ) 这是一个间隙锁会申请锁住[4,10],[10,20]之间的gap区域。从这里会发现,即使是RC事务隔离级别,也同样会存在Next-Key Lock锁,从而阻塞并发。
T2 insert into t7(id,a) values(40,9) 该语句插入的a=9 的值在 T1申请的gap锁[4,10]之间,故需T2的第二条insert语句要等待T1的S-Next-key Lock锁释放,在日志中显示lock_mode X locks gap before rec insert intention waiting
四 总结
首先感谢登博和姜承尧两位德艺双馨的MySQL技术大牛对死锁技术知识的无私分享。本文案例和知识点一方面从官方文档获取,另一方面是根据两位大牛的分享整理,算是站在巨人的肩膀上的学习总结。在研究分析死锁案例的过程中,insert 的意向锁 和 gap 锁这种类型的锁是比较难分析的,相信通过上面的分析总结大家能够学习到 insert的锁机制 ,如何加锁,如何进行 insert 方面死锁分析。
如果各位觉得阅读本文能够有所收获 欢迎 打赏一瓶饮料

死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。
二 背景知识
2.1 insert 锁机制
在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略。我们先来看看官方定义:
sess1
sess2
begin;
delete from t8 where b = 1;
begin;
insert into t8 values (NULL,1);
commit;
update t8 set
T2
begin;
begin;
insert into t7(id,a) values(26,10);
insert into t7(id,a) values(30,10);
insert into t7(id,a) values(40,9);
3.3 死锁日志
- ------------------------
- LATEST DETECTED DEADLOCK
- ------------------------
- 2017-09-17 15:15:03 7f78eac15700
- *** (1) TRANSACTION:
- TRANSACTION 462308661, ACTIVE 6 sec inserting
- mysql tables in use 1, locked 1
- LOCK WAIT 2 lock struct(s), heap size 360, 1 row lock(s), undo log entries 1
- MySQL thread id 3796966, OS thread handle 0x7f78ead9d700, query id 781045166 localhost root update
- insert into t7(id,a) values(30,10)
- *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
- RECORD LOCKS space id 231 page no 4 n bits 72 index `ua` of table `test`.`t7` trx id 462308661 lock mode S waiting
- *** (2) TRANSACTION:
- TRANSACTION 462308660, ACTIVE 43 sec inserting, thread declared inside InnoDB 5000
- mysql tables in use 1, locked 1
- 4 lock struct(s), heap size 1184, 3 row lock(s), undo log entries 2
- MySQL thread id 3796960, OS thread handle 0x7f78eac15700, query id 781045192 localhost root update
- insert into t7(id,a) values(40,9)
- *** (2) HOLDS THE LOCK(S):
- RECORD LOCKS space id 231 page no 4 n bits 72 index `ua` of table `test`.`t7` trx id 462308660 lock_mode X locks rec but not gap
- *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
- RECORD LOCKS space id 231 page no 4 n bits 72 index `ua` of table `test`.`t7` trx id 462308660 lock_mode X locks gap before rec insert intention waiting
- *** WE ROLL BACK TRANSACTION (1)
我们从时间线维度分析:
T2 insert into t7(id,a) values(26,10)语句insert 成功,持有a=10 的X 行锁(X locks rec but not gap)
T1 insert into t7(id,a) values(30,10),因为T2 的第一条insert已经插入a=10的记录,T1的 insert a=10 则发生唯一约束冲突,需要申请对冲突的唯一索引加上S Next-key Lock (也即是 lock mode S waiting ) 这是一个间隙锁会申请锁住[4,10],[10,20]之间的gap区域。从这里会发现,即使是RC事务隔离级别,也同样会存在Next-Key Lock锁,从而阻塞并发。
T2 insert into t7(id,a) values(40,9) 该语句插入的a=9 的值在 T1申请的gap锁[4,10]之间,故需T2的第二条insert语句要等待T1的S-Next-key Lock锁释放,在日志中显示lock_mode X locks gap before rec insert intention waiting
四 总结
首先感谢登博和姜承尧两位德艺双馨的MySQL技术大牛对死锁技术知识的无私分享。本文案例和知识点一方面从官方文档获取,另一方面是根据两位大牛的分享整理,算是站在巨人的肩膀上的学习总结。在研究分析死锁案例的过程中,insert 的意向锁 和 gap 锁这种类型的锁是比较难分析的,相信通过上面的分析总结大家能够学习到 insert的锁机制 ,如何加锁,如何进行 insert 方面死锁分析。
如果各位觉得阅读本文能够有所收获 欢迎 打赏一瓶饮料

死锁
分析
案例
知识
语句
技术
日志
学习
之间
官方
朋友
机制
背景
过程
大牛
冲突
成功
德艺双馨
有意思
一方
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
暑假不知道玩什么服务器
网络安全监测装置说明书
超级列表框修改多条数据库
知网定稿查重数据库
长沙软件开发品牌
计算机网络技术校园网课程设计
易语言模拟服务器协议
达梦数据库导出成sql文件
服务器蓝灯长亮
检测网络安全等级
服务器机械硬盘拆解
网络安全成人大学
网上软件开发群是真的吗
畅捷通网络安全检测报告
网络安全电影名字
网信办 网络安全体系
网络安全监管设备
虚拟仿真软件开发待遇
网络安全法 客户网站
一键架设服务器
广播电视网络技术部个人总结
网络安全近些年的发展
数据库连接协议
数据库设计基础概念模型
网络安全策略怎么学
服务器cpu什么意思
服务器机箱机柜批发
网关于网络安全的手抄报
数据库登录初始化失败
阿里云服务器一键安装