日期: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 锁。
面试官追问
- 为什么说行锁是索引锁?
- next-key lock 锁住的范围是什么?
- MDL 为什么会阻塞 DDL?
学习清单
- 将 record、gap、next-key 的适用场景画成索引区间。