,,,,死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。
<强> 强>
<强> 2.1插入锁机制强>
在分析死锁案例之前,我们先学习一下背景知识插入语句的加锁策略。我们先来看看官方定义:
<强> 3.3死锁日志强>
-
<李>
李> <李> 最新检测到死锁
李> <李>
李> <李> 20170917 151503 7 f78eac15700
李> <李> 1交易
李> <李> 事务462308661活跃6秒插入
李> <李> 使用mysql表1锁定1
李> <李> 360年代堆1行s undo日志条目1
李> <李> MySQL线程id 3796966 OS线程句柄0 x7f78ead9d700查询id 3796966 localhost根更新
李> <李> 插入t7ida values3010
李> <李> 1等待获准
李> <李> 锁空间id 231页4 n位72指数ua的表t7 trx id 462308661模式年代等待
李> <李> 2交易
李> <李> 事务462308660活跃43秒插入线程内宣布InnoDB 5000
李> <李> 使用mysql表1锁定1
李> <李> 4堆1184 3行s undo日志条目2
李> <李> MySQL线程id 3796960 OS线程句柄0 x7f78eac15700查询id 3796960 localhost根更新
李> <李> 插入t7ida values409
李> <李> 2把(S
李> <李> 锁空间id 231页4 n位72指数ua的表的t7 trx id 462308660 lock_mode X锁rec但差距
李> <李> 2等待获准
李> <李> 锁空间id 231页4 n位72指数ua的表的t7 trx id 462308660 lock_mode X锁差距rec之前插入意图等
李> <李> 我们回滚事务1 李>
我们从时间线维度分析:
T2插入t7 (id)值(26岁,10)语句插入成功,持有X=10的行锁(X锁rec但不是差距)
T1插入t7 (id)值(30、10),因为T2的第一条插入已经插入=10的记录,T1的插入一个=10则发生唯一约束冲突,需要申请对冲突的唯一索引加上S键锁(也即是锁定模式S等)这是一个间隙锁会申请锁住(4、10)(10、20)之间的差距区域。从这里会发现,即使是RC事务隔离级别,也同样会存在第二个关键锁锁,从而阻塞并发。
T2插入t7 (id)值(40岁,9)该语句插入的=9的值在T1申请锁的差距(4、10)之间,故需T2的第二条插入语句要等待T1的S-Next-key锁锁释放,在日志中显示lock_mode X锁差距rec之前插入意图等
<强> 强>
,首先感谢登博和姜承尧两位德艺双馨的MySQL技术大牛对死锁技术知识的无私分享。本文案例和知识点一方面从官方文档获取,另一方面是根据两位大牛的分享整理,算是站在巨人的肩膀上的学习总结。在研究分析死锁案例的过程中,插入的意向锁和锁的差距这种类型的锁是比较难分析的,相信通过上面的分析总结大家能够学习到插入的锁机制,如何加锁,如何进行插入方面死锁分析。
如果各位觉得阅读本文能够有所收获欢迎打赏一瓶饮料,
【MySQL】死锁案例之三