持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 6 天,点击查看活动详情
哈喽,大家好,我是二毛。
上篇文章 面试官:按范围维度总结 Mysql 的各种锁 我们进行 Mysql 各种锁的总结。
我们学习了间隙锁和next-key-lock,但是不知道怎么加锁,有哪些规则。间隙锁的概念不太好理解,尤其是配合上行锁后,很容易在判断是否会出现锁等待的问题上犯错。
今天我们一起来探讨下。
加锁规则
总结起来就是:加锁规则包含两个“原则”、两个“优化”。
- 原则1:加锁的基本单位是next-key lock。而next-key lock是前开后闭区间。
- 原则2:查找过程中访问到的记录才会加锁。
- 优化1:唯一索引上的等值查询,加锁的时候,next-key lock退化为行锁。
- 优化2:普通索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock退化为间隙锁。
对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。比如说针对记录id (1,2,3),那么:
- (1,3] 为next-key-lock
- (1,3) 为间隙锁
- 3 为行锁
下面分情况探讨下。
唯一索引等值查询
当查询的记录是存在的,next-key lock 会退化成「行锁」。
当查询的记录是不存在的,next-key lock 会退化成「间隙锁」。
非唯一索引等值查询
当查询的记录存在时,除了会加 next-key lock 外,还额外加间隙锁,也就是会加两把锁。
当查询的记录不存在时,只会加 next-key lock,然后会退化为间隙锁,也就是只会加一把锁。
唯一索引范围查询
唯一索引在满足一些条件的时候,next-key lock 退化为间隙锁和记录锁。
非唯一索引范围查询
非唯一索引范围查询,next-key lock 不会退化为间隙锁和记录锁。
最后
以上就是我对 Mysql 加锁的一些总结,希望对大家有用。
我是二毛,我们下期再见~