行锁、间隙锁、临键锁
行锁 也叫记录锁 锁定的是某一行一级
间隙锁 锁定的是记录与记录之间的空隙,间隙锁只阻塞插入操作,解决幻读问题
临键锁 nextkeylock 是行锁与间隙锁的并集,是mysql加锁的基本单位
原则1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间。
原则2:查找过程中访问到的对象才会加锁。
优化1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
优化2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。 8.0.22之后已修复
案例:一张表t id(主键)、c(普通索引)、d 字段 插入数据(0,0,0),(5,5,5),(10,10,10),(15,15,15)
- update t set d=1 where id = 7 主键索引上的 (5,10)间隙锁
- update t set d=1 where id = 5 主键索引上的 5行锁
- update t set d=1 where c = 7 普通索引上的 (5,10)间隙锁
- update t set d=1 where c = 5 普通索引上的 (0,5]临键锁 (5,10)间隙锁
- update t set d=1 where c <11 普通索引上的 (0,15]临键锁
- update t set d=1 where c >=10 普通索引上的 (5,10]临键锁 (10,~]的临键锁
- update t set d=1 where c >=10 and c <11 普通索引上的 (5,15]临键锁
- update t set d=1 where id >=10 and id <11 主键索引上的 10行锁 (10,15)间隙锁
网友评论