Skip to Content
面试题库Locks[知识讲解]MySQL的三把锁分别是什么?Record lock的本质又是什么?

[知识讲解]MySQL的三把锁分别是什么?Record lock的本质又是什么?

📖 知识讲解版 (温故知新)

  • 行级锁的三把锁

    1. 记录锁 (Record Lock):锁定单条索引记录。
    2. 间隙锁 (Gap Lock):锁定索引记录之间的间隙,防止幻读(仅在 RR 隔离级别下有效)。
    3. 临键锁 (Next-Key Lock):记录锁 + 间隙锁的组合,锁定一个左开右闭区间。
  • Record Lock 的本质:其本质是防止目标范围内的数据发生额外的变化,是加在索引上的。


关于这三把锁,我认为是深入理解 InnoDB 并发控制的钥匙。

第一把是记录锁(Record Lock):顾名思义,它仅仅锁住一条具体的索引记录。它的本质其实就是防止其他事务对这条具体的数据进行修改或删除。

第二把是间隙锁(Gap Lock):它不锁记录,而是锁住两条索引记录之间的“间隙”。它的主要作用是防止其他事务在这个间隙里插入新数据,从而解决幻读问题。需要注意的是,间隙锁只在可重复读(RR)隔离级别下才生效。

第三把是临键锁(Next-Key Lock):它是记录锁和间隙锁的结合体,锁住的是一个左开右闭的区间(锁定间隙的同时也锁定右边界的记录)。

这时候其实有一个很重要的细节,很多人以为 MySQL 加锁是一个个去加的,其实不是。MySQL 加行锁的基本单位其实就是临键锁(Next-Key Lock)。这三把锁通过协作,核心目的就是避免修改范围内的数据发生不可预期的变化。

在排查死锁日志时,我经常看到等待 Gap Lock 或 Next-Key Lock 的信息,这通常是因为范围更新或者唯一索引去查不存在的记录引发的。

最后更新于:
⏱️

登录后开始阅读

当前 MVP 版本只开放邮箱密码登录注册。完成登录后即可进入面试题内容。

还没有账号?先去注册