深入MySQL死锁场景
总结死锁需满足以下条件:
- 2个或者2个以上的并发事务操作
- 并发事务之间存在锁冲突
- 锁冲突关系成环形
GAP锁和Insert的隐式锁,最容易导致死锁,以下分析从这俩典型场景开始。
1. 表结构
建立以下表作为场景验证,id为主键,使用InnoDB,版本是5.7+,隔离级别RR。
CREATE TABLE `trigger` (`id` char(50) NOT NULL,`name` varchar(128) DEFAULT NULL,`cron` varchar(50) DEFAULT '0',`timeout` int(10) DEFAULT '0',`status` int(1) DEFAULT '0',`job_id` char(50) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `index_id` (`id`) USING BTREE,KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2. 死锁场景一
原因分析:行记录不存在时,加记录X锁变成加GAP X锁,GAP X锁可共存,插入意向锁与GAP X冲突导致死锁。
t1时刻:select for update where id=3加锁过程:默认加NextKey锁,但id=3不存在,退化为GAP锁
t2时刻:T2事务同样获取到GAP锁,因为GAP锁是共存锁
t3时刻:INSERT加锁过程:因为其他事务有GAP锁,需要加插入意向锁,等待T2释放
t4时刻:因为其他事务有GAP锁,需要加插入意向锁,等待T1释放,死锁
t3时的锁信息如下(select * from information_schema.innodb_locks
):
GAP X锁,锁的范围是(下一个存在的索引值,上一个存在的索引值) 注意是开区间,id=3在这个范围内,所以当加插入意向锁时会冲突。
锁等待信息如下:
tips:因为做了多次复现操作,事务ID不一定完全一致,能说明问题即可。
show engine innodb status
查看死锁信息。
T1事务在等待插入意向锁,T2拥有一个GAP X锁,同样在等待插入意向锁,检测到死锁,选择了T2进行回滚。
3.死锁场景二
原因分析:插入数据唯一索引冲突时,先获取GAP S锁,GAP S锁可共存,但与记录X锁冲突,插入意向锁与GAP S锁也会冲突,最终导致死锁。
t1时刻:T1 INSERT实际上未加锁,因为无任何冲突
t2时刻:T2出现INSERT唯一索引冲突,会给T1增加一个记录X锁,自身获取GAP S锁时,等待
t3时刻:T3同上获取GAP S锁时阻塞
t4时刻:T1操作回滚,释放记录X锁,T2和T3得到GAP S锁,接着获取插入意向锁,但与其他事务GAP S锁冲突,死锁。
t3时的锁信息如下(select * from information_schema.innodb_locks
):
锁等待信息如下
死锁信息如下
只看到T2和T3,因为T1已经回滚结束。T2和T3都在等待获取插入意向锁,死锁状态。
补充一点innodb status的信息说明:
死锁信息显示
- 记录锁(LOCK_REC_NOT_GAP): lock_mode X locks rec but not gap
- 间隙锁(LOCK_GAP): lock_mode X locks gap before rec
- Next-key 锁(LOCK_ORNIDARY): lock_mode X
- 插入意向锁(LOCK_INSERT_INTENTION): lock_mode X locks gap before rec insert intention
深入MySQL死锁场景相关推荐
- mysql死锁场景汇总整理
目录 简述 行锁导致死锁 gap lock/next keys lock导致死锁 index merge导致死锁 唯一索引冲突导致死锁 总结 简述 本文死锁场景皆为工作中遇到(或同事遇到)并解决的死锁 ...
- mysql for update场景_一个mysql死锁场景实例分析
前言 最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录. 涉及知识点:共享锁.排他锁.意向锁.间隙锁.插入意向锁.锁等待队列 场景 隔离级别:Repeatable-Re ...
- mysql死锁 gap next key 加锁分析
这个案例的原文参见: mysql死锁场景汇总整理_死锁业务场景_秃了也弱了.的博客-CSDN博客 那么我们就来分析下整个加锁过程吧. 关键词: next-key & gap 锁 & 插 ...
- 手把手教你分析MySQL死锁问题,十分钟看完文章下次轻松完成不加班
发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题 准备好数据环境 模拟死锁案发 分析死锁日志 分析死锁结果 环境准备 数据库隔离级别: mysql> select @@tx_isolat ...
- mysql 秀出两个相关联的表中满足条件的内容_这六个 MySQL 死锁案例,能让你理解死锁的原因!...
点击蓝色"架构文摘"关注我哟 加个"星标",每天上午 09:25,干货推送! 来源:王啸tr1912 | https://blog.csdn.net/tr1 ...
- mysql len hex asc_线上频出MySQL死锁问题!分享一下自己教科书般的排查和分析过程!...
本文主要是讲过程与思路,从手上的日志来反推故障现场,最后模拟出事故现场.没有过度讲解理论的一些知识,主要是偏分析. 文章参考的理论知识在最后,同时也将本次案例提交 ISSUE 给:https://gi ...
- 数据库:分享六个 MySQL 死锁案例,能让你理解死锁的原因!
正文 最近总结了一波死锁问题,和大家分享一下,我这也是从网上各种浏览博客得来,希望原作者见谅,参考博客文末下方. Mysql 锁类型和加锁分析MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销 ...
- MySQL死锁如何处理
转载自 MySQL死锁如何处理 前提 笔者负责的一个系统最近有新功能上线后突然在预警模块不定时报出MySQL死锁导致事务回滚.幸亏,上游系统采用了异步推送和同步查询结合的方式,感知到推送失败及时进行 ...
- 一次MySQL死锁问题解决
一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...
最新文章
- 关于一个简易的实时内存监控系统的思维导图
- 给羊羔:学习web前端开发的路线(一)
- 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)
- php判断参数_php检查函数必传参数是否存在的实例详解
- PHP实时生成并下载超大数据量的EXCEL文件 1
- html5与css3基础教程课件,揭秘HTML5和CSS3教学幻灯片.ppt
- iOS h264硬编码
- 简单理解下内存的几大区域
- memcpy-avx-unaligned/strcpy_sse2_unaligned崩溃记录
- android NDK安装
- OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
- 推荐一个文字生成图片的网站
- c语言 srand,函数srand在C中
- no identity-based policy allows the cloudformation:CreateStack action
- Teambition使用教程
- node api框架_使用Web API,Node和Nexmo从浏览器发送SMS
- 永久开源的cms系统
- python自动化测试脚本怎么写_自动化测试脚本一般用什么语言写
- DZ插件制作简易入门教程(自学手记)第一篇
- 松果在线报名系统网站源码