导读:引发死锁的原因是什么?如何避免?本文详细介绍了和死锁有关的知识点|mysql事务并发机制详解( 二 )
UPDATEstudentsSETscore=100WHEREid=16;
RC不加锁 , RR在16之前和之后的范围里加GAP锁 。
3)二级唯一索引(查询命中)
UPDATEstudentsSETscore=100WHEREno='S0003';
文章图片
RC、RR会对二级和聚簇索引都加X锁(防止其他事务通过聚簇改数据) 。
4)二级唯一索引(查询未命中)
UPDATEstudentsSETscore=100WHEREno='S0008';
文章图片
RC不加锁 , RR只在二级索引加GAP 。
5)二级非唯一索引(查询命中)
UPDATEstudentsSETscore=100WHEREname='Tom';
文章图片
RC对二级和聚簇加X锁 , RR对二级加X锁和Gap对聚簇加X锁 。
6)二级非唯一索引(查询未命中)
UPDATEstudentsSETscore=100WHEREname='John';
RC不加锁 , RR只在二级索引加GAP 。
注:以上图片源自
https://zhuanlan.zhihu.com/p/245584417
INSERT语句加锁
为了防止幻读 , 如果记录之间加有GAP锁 , 此时不能INSERT 。
如果INSERT的记录和已有记录造成唯一键冲突 , 此时不能INSERT 。
三、线上CASE
1、分析服务线上日志
发现死锁是两个事务对同一个表先delete后insert交叉进行引起的:
deletefromdb.tablewherecreativeid=102(且删除条数为0)
deletefromdb.tablewherecreativeid=103(且删除条数为0)
insertintodb.table(creativeid)values(102)
insertintodb.table(creativeid)values(103)
2、分析MySQL死锁日志
可见事务1要对一个已被间隙锁控制的记录进行插入意向锁录入 , 遂进入阻塞等待间隙锁释放 , 而恰巧另一个事务也同样要对一个被间隙锁控制的记录进行插入意向锁录入 , 阻塞等待 , 当两个事务间隙锁碰巧有交集时就进入了死循环最后死锁 。
3、梳理解决方案
降低隔离级别为RC , 避免间隙锁(降级后会有不可重复读和幻读问题) 。
设置InnoDB在RR级别下不使用间隙锁(关闭后会有幻读问题) 。
删除前先判断是否存在 , 存在再删除 , 可以完全避免死锁(会导致重复数据录入) 。
在极端情况下 , 两个事务同时执行Select都不存在然后Insert , 导致重复数据录入 。
解决方案:方案1:selectforupdate(会降低并发度) 。 方案2:加唯一索引 , 捕获异常回滚不执行 。 方案3:若允许极端少数重复数据(仅文案展示) , 则无需处理 。
另外也要注意尽量避免大事务 , 它不仅会降低并发还会提高死锁几率 。
最终解决方案采用先判断再删除 , 目前涉及表为文案展示 , 允许极端情况下少量数据重复 , 故而暂不做绝对唯一处理 。
4、方案3原理详解
还原线上场景:假设表中有1 , 6两条数据 , 两个事务分别要对不存在的2、5进行先删后插 , 且交叉执行 。
假设表中不存在2和5对应记录 , 只有1和6
可见T1和T2的插入意向锁都要等待对方释放Gap锁 , 死循环 。
现在我们修改逻辑 , 在删除前先判断 , 只有存在记录才进行delete操作 。
假设表中2和5都存在
可见事务1和事务2的间隙锁范围不重叠 , 都可以成功施加插入意向锁 。
我们再罗列另外一种情况 , 就是2或5只存在一个 , 会不会出现死锁呢?
假设表中2存在
可见虽然事务2可能插入意向锁记录被事务1占据 , 但是不会有死循环发生 , 等到事务1执行完释放锁就可以继续进行了 。
综上所述 , 方案3可以完全避免死锁问题 。
四、死锁场景分享
死锁案例一
- Flyme|“国产系统之光”Flyme迎来十周年,纪念海报上线引发热议
- 新西兰的天文爱好者在夜空中发现了一种奇怪的螺旋光|新西兰上空出现神秘蓝色螺旋引发热议,专家称是SpaceX发射火箭导致
- 今年618大促|手机销量下滑引发手机渠道商寒冬
- 阴阳师|被质疑内部人员引发玩家矛盾 网易阴阳师手游回应
- 网易阴阳师手游:引发玩家矛盾者非内部人员 将追责内部信息泄露
- 联想小新pro16|京东618广告,又是外国男性中国太太?引发网友崇洋媚外吐槽
- 欧盟|魅友,心爱传家活动引发关注!两年质保+免费换电池通通一步到位
- AMD|x86 CPU 危!最新漏洞引发热议 黑客可远程窃取密钥
- Kindle|由观察平台热门视频引发的若干思考 第3篇
- 贾跃亭|由观察平台热门视频引发的若干思考第6篇
