Yihui’s Blog

MySQL 中有哪些锁类型?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #InnoDB #锁

一句话答案

按粒度有全局锁、表锁和 InnoDB 行级锁;行锁又包括记录锁、间隙锁和临键锁,另外还有共享/排他、意向锁以及元数据锁等不同维度。

原理拆解

维度类型作用
兼容性S 共享锁、X 排他锁S 可共存,X 与其他 S/X 冲突
范围record / gap / next-key锁单条索引记录、记录间隙、记录加前间隙
表级协调IS / IX 意向锁表明事务将在行上加 S/X 锁,协调表锁
其他MDL、AUTO-INC、全局读锁保护表结构、自增分配和备份一致性

面试口语版

InnoDB 常说的行锁实际是“索引上的锁”。等值命中唯一索引时通常是记录锁;范围条件或非唯一索引条件下,为防止并发插入可能出现间隙锁或 next-key lock,具体受隔离级别和执行计划影响。S 锁用于共享读,X 锁用于修改;意向锁在表级快速表明行锁意图。还要注意 MDL,它由 SQL 层自动加,长事务不结束会让 DDL 等待。

关键细节

  • 没有合适索引时,扫描和加锁范围会扩大,表现得像“锁表”。
  • InnoDB 不做锁升级,但大量行锁仍会占内存并造成竞争。
  • SELECT ... FOR UPDATE 是当前读并申请 X 锁。

面试官追问

  1. 为什么说行锁是索引锁?
  2. next-key lock 锁住的范围是什么?
  3. MDL 为什么会阻塞 DDL?

学习清单

  • 将 record、gap、next-key 的适用场景画成索引区间。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts