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)范围锁,此时发生死锁。