InnoDB的next-Key Lock机制退化及死锁实例

1 next-key机制的退化原则

原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间。
原则 2:只有访问到的对象才会加锁。
优化 1:索引上的等值查询,
    命中唯一索,退化为行锁。
    命中普通索引,左右两边的GAP Lock + Record Lock。
优化 2:
    索引上的等值查询,未命中,所在的Net-Key Lock,退化为GAP Lock 。
索引在范围查询: 
    1.等值和范围分开判断。
    2.索引在范围查询的时候 都会访问到所在区间不满足条件的第一个值为止。
    3.如果使用了倒叙排序,按照倒叙排序后,
    检索范围的右边多加一个GAP。
    哪个方向还有命中的等值判断,再向同方向拓展外开里闭的区间。

2 死锁示例

     解释Mysql技术内幕:InnoDB书中死锁实例的原因
1)AB-BA死锁:x如下图,不需要解释在这里插入图片描述
2)特殊死锁:
在这里插入图片描述
原因:事务A第一条select … for update 获取记录4的X锁(唯一索引且命中,故范围锁退化为record锁,即普通行锁),事务B中的a<=4是范围查找,分为等值和范围,等值要获取记录4的S锁,范围获取(1,4)的锁,此时因为A占用记录4,B阻塞,A要插入3,未命中,尝试获取(2,4)范围锁,此时发生死锁。

猜你喜欢

转载自blog.csdn.net/weixin_43849906/article/details/121338833