04 - 锁机制
定位:锁是数据库并发控制的最终防线——理解锁的粒度、兼容性和死锁检测,才能写出无死锁的高并发代码 面试高频度:⭐⭐⭐⭐⭐
一、板块在体系中的位置
┌──────────────────────────────────────┐
│ 03-SQL与事务 (前驱知识) │
│ MVCC、隔离级别、ACID │
└────────────────┬─────────────────────┘
↓
┌──────────────────────────────────────┐
│ 04-锁机制 (本板块) │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ 锁分类 │ │行锁与 │ │死锁 │ │
│ │ │ │间隙锁 │ │分析 │ │
│ └────────┘ └────────┘ └────────┘ │
└───────┬─────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 05-日志系统 │
│ Redo + Undo + Binlog │
└──────────────────────────────────────┘二、知识全景图
InnoDB 锁体系
├── 粒度
│ ├── 行级锁 (Row Lock)
│ │ ├── Record Lock ── 锁定单条索引记录
│ │ ├── Gap Lock ── 锁定索引记录之间的间隙
│ │ └── Next-Key Lock ── Record Lock + Gap Lock(防幻读)
│ ├── 表级锁 (Table Lock)
│ │ ├── 意向共享锁 (IS)
│ │ └── 意向排他锁 (IX)
│ └── 其他
│ ├── 自增锁 (AUTO-INC Lock)
│ └── 谓词锁 (Predicate Lock,空间索引)
├── 模式
│ ├── 共享锁 (S Lock) ── 读读不互斥,读写互斥
│ └── 排他锁 (X Lock) ── 读写、写写都互斥
├── 加锁方式
│ ├── 隐式加锁 ── DML 语句自动加锁
│ ├── 显式加锁 ── SELECT ... FOR UPDATE / LOCK IN SHARE MODE
│ └── 锁升级 ── 行锁不会升级为页锁/表锁
└── 死锁
├── 四个必要条件
└── 检测机制三、子专题导航
| # | 主题 | 面试频率 | 核心内容 |
|---|---|---|---|
| **InnoDB锁分类** | InnoDB 锁分类 | ⭐⭐⭐⭐ | 行锁/表锁/意向锁、S锁/X锁、锁兼容性矩阵 |
| **行锁与间隙锁** | 行锁与间隙锁 | ⭐⭐⭐⭐⭐ | Record/Gap/Next-Key Lock、加锁规则、幻读防御 |
| **死锁分析与排查** | 死锁分析与排查 | ⭐⭐⭐⭐ | 死锁原因、SHOW ENGINE INNODB STATUS、常用策略 |
四、核心考点速记
考点1:S锁和X锁的兼容性
| 当前持有锁 | 请求 S 锁 | 请求 X 锁 |
|---|---|---|
| S 锁 | ✅ 兼容 | ❌ 等待 |
| X 锁 | ❌ 等待 | ❌ 等待 |
考点2:三种行锁的区别
Record Lock: 锁定索引上的某一条记录
例如: WHERE id=1 → 只锁 id=1 这行
Gap Lock: 锁定两条索引记录之间的间隙
例如: WHERE id BETWEEN 1 AND 10 → 锁(1,10)间隙
作用: 防止其他事务在间隙中插入新行(防幻读)
Next-Key Lock: Record Lock + Gap Lock
例如: 对 id=10 加 Next-Key Lock → 锁[10, 下一个key)
作用: 锁定记录+防止前面间隙插入 = RR 下防幻读📚 相关文件
- 上游板块:**SQL与事务**
- 下游板块:**日志系统**
- ← 返回 **设计文档**