分享更有价值
被信任是一种快乐

MySQL死锁分析

文章页正文上

本篇内容介绍了“MySQL死锁分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RC 隔离级别很少出GAP我已经知道的继承和分裂会出LOCK_GAP这是代码写死的
purge线程可能触发
页的分裂融合可能触发
内部回滚可能触发唯一性检查会出LOCK_ORDINARY[next_key_lock]RC RR级别通用死锁表结构和数据死锁构造流程死锁记录这个死锁实际上涉及到锁的继承和分裂我们分析如下两个事物堵塞的案例和加锁步骤,主要弄明白gap lock怎么来的。步骤如下:我们只用2个事物来分析流程,实际上流程知道了原因也就知道了。前奏
T1的插入不上任何锁,因为插入如果下一条记录没有锁,因此是隐含锁。分析从T2
insert into testunj1 values(16,17,’gaopeng’); 堵塞开始第一步 T2执行 insert into testunj1 values(16,17,’gaopeng’); 步骤1T2帮助T1隐士锁转换 上LOCK_X,这里通过函数lock_rec_convert_impl_to_expl 进行转换。栈帧如下:第二步 insert into testunj1 values(16,17,’gaopeng’); 步骤2需要做唯一性检查不通过上LOCK_ORDINARY[next_key_lock]等待,唯一检查会涉及到主键和唯一键,如果主键检查通过则会插入数据,然后检查二级唯一索引,如果唯一索引冲突,则主键插入的数据需要回滚。这里是因为每个索引是单独调用row_ins_index_entry_step上层函数进行单独插入的。栈帧如下:这两步完成后,我们可以到LOCK_S|LOCK_ORDINARY[next_key_lock]的存在第三步 T1帮助T2做锁继承
从事物的指针0x7ffff10ca5f0可以看出是T2,如果有多个事物LOCK_GAP是兼容所以都可以继承完成,LOCK_GAP的存在只是为了LOCK_INTENTION,就是为了防止幻读。
如果做了GDB可以看到这里继承的锁:546 = 512+2+32= LOCK_GAP+LOCK_S+LOCK_REC 这个锁继承给了 heap 4 也就是记录 20(heir_heap_no=4, heap_no=5)这里将LOCK_S|LOCK_GAP 继承到heap_no 4 上也就是 记录记录20上。栈帧如下:T2自己做分裂了
分裂(heir_heap_no=5, heap_no=4) 可以看到这里将 记录20的type_mode=546分裂给记录17 也就是512+2+32=LOCK_GAP+LOCK_S+LOCK_REC。栈帧如下:最终形成如下的锁模式,因为记录 11,11已经不存在了因此下不会有任免费主机域名何记录可以看到 lock mode S(LOCK_S) locks gap before rec(LOCK_GAP) 已经出来了。lock_rec_has_to_wait 检测是否需要等待RecLock::add_to_waitq 将LOCK_T结构加入到rec hash中(等待)RecLock::lock_add 将LOCK_T结构加入到rec hash中lock_rec_set_nth_bit 设置LOCK_T位图row_ins_scan_sec_index_for_duplicate 二级唯一索引唯一性检查加锁函数lock_rec_other_has_conflicting 判断冲突->lock_rec_has_to_wait 检测是否需要等待lock_rec_inherit_to_gap LOCK继承函数lock_rec_inherit_to_gap_if_gap_lock LOCK分裂函数lock_rec_convert_impl_to_expl 隐含锁转换函数,比较复杂row_ins_scan_sec_index_for_duplicate 片段:row_ins_dupl_error_with_rec 片段:本系统没有ROLLBACK,但是 INSERT ON DUPLICATE 语句,对于 INSERT ON DUPLICATE/REPLACE语句都是做唯一性检查的时候普通语句进行报错,但是这两个语句会返回错误给上层,接着做相应的处理INSERT ON DUPLICATE 是调用的UPDATE接口REPLACE是调用的DEL免费主机域名ETE 然后 INSERT的接口因此两类语句出现堵插入印象的地方就有两处要么是初次INSERT的时候,要么是唯一键冲突造成的二次更改上。而对于 INSERT ON DUPLICATE/REPLACE做唯一性检测的时候上的LOCK_X并非LOCK_S如下:因此 INSERT ON DUPLICATE/REPLACE两个语句需要加锁的地方比较多并且流程比较复杂,分析比较麻烦。死锁如下:5.7.22RC隔离级别行数据2000W左右INSERT ON DUPLICATE语句LOCK_GAP存在间隔一键时间触发本死锁无应用发起ROLLBACK唯一二级索引不太合理键值教长如果哪位大哥分析出来请赐教死锁记录“MySQL死锁分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云技术网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 怎么使用RMAN

本篇内容介绍了“怎么使用RMAN”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RMAN的备份脚本可以存储在恢复目录或者操作系统免费主机域名文本文件。1.创建RM…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册