面试官:Mysql的加锁规则是怎么样的?

249 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 6 天,点击查看活动详情

哈喽,大家好,我是二毛。

上篇文章 面试官:按范围维度总结 Mysql 的各种锁 我们进行 Mysql 各种锁的总结。

我们学习了间隙锁和next-key-lock,但是不知道怎么加锁,有哪些规则。间隙锁的概念不太好理解,尤其是配合上行锁后,很容易在判断是否会出现锁等待的问题上犯错。

今天我们一起来探讨下。

加锁规则

总结起来就是:加锁规则包含两个“原则”、两个“优化”。

  1. 原则1:加锁的基本单位是next-key lock。而next-key lock是前开后闭区间。
  2. 原则2:查找过程中访问到的记录才会加锁。
  3. 优化1:唯一索引上的等值查询,加锁的时候,next-key lock退化为行锁。
  4. 优化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 加锁的一些总结,希望对大家有用。

我是二毛,我们下期再见~