深入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左右. 二.错误日 ...
最新文章
- Java集合框架图(学习)
- 工具|渗透测试之5种工具分享(Shiro插件、CTFR、JR-scan、dirsearch-Web等)
- ASP.NET Core appsettings.json文件(9)《从零开始学ASP.NET CORE MVC》:
- .net平台的MongoDB使用
- android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS
- ICLR 2020丨微软亚洲研究院精选论文解读
- 深度学习 | Why and How:神经网络中的权重初始化
- python+pyqt5实现24点小游戏
- K8S_Google工作笔记0011---通过二进制方式_为APIServer生成自签证书
- UI动画的一些制作过程
- 斯坦福大学Andrew Ng教授主讲的《机器学习》公开课观后感
- Alpine Linux如何安装软件
- 数值分析 有效数字计算
- your cuda software stack is old.we fall back to the NIVIDIA driver for some compilation. Update your
- C语言编程>第二十二周 ② 请补充fun函数,该函数的功能是:返回字符数组中指定字符的个数,指定字符从键盘输入。
- 量化学习:大数据时代的学习方式
- 大学生学习编程很难吗?怎么样才能学好编程?
- 黑吃黑第四季/全集Banshee迅雷下载
- css+html 在文字下面加点。
- Android DataBinding RecyclerView AAPT: error: attribute adapter (aka......) not found.
热门文章
- 吴恩达深度学习笔记【2】
- 前 SAP 副总裁入职头部电子签名商,人才战略加速扩大产品服务优势
- python __builtin__,一处设置, 全局引用
- 刚刚,2023中国大学评级发布!9所高校,位列最顶级!
- BAT的智慧城市梦,该醒醒了
- CH569 USB3.0 布线
- **matlab中 mean用法**
- POJ-2676 Sudoku(简单数独-dfs深搜)
- html调用其他网页内容
- An enum switch case label must be the unqualified name of an enumeration cons