外观
一句话答案
InnoDB 锁体系:行锁(记录锁/间隙锁/临键锁)+ 表锁(意向锁/AUTO-INC 锁),行锁基于索引加锁。
核心要点
按锁粒度:
1. 表级锁
LOCK TABLES table READ/WRITE- 意向锁(IS/IX):行锁前先加意向锁,使表锁检测行锁是否存在更高效
- 事务要加行共享锁 → 先在表上加意向共享锁(IS)
- 事务要加行排他锁 → 先在表上加意向排他锁(IX)
2. 行级锁(InnoDB 特有,针对索引项加锁)
| 锁类型 | 英文 | 锁定范围 | 作用 |
|---|---|---|---|
| 记录锁(Record Lock) | Record Lock | 锁定单个索引记录 | 防止其他事务修改/删除该行 |
| 间隙锁(Gap Lock) | Gap Lock | 锁定两个索引记录之间的"间隙"(不含端点) | 防止在间隙中插入新行(防幻读) |
| 临键锁(Next-Key Lock) | Next-Key Lock | 记录锁 + 左侧间隙锁 = 前开后闭区间 (a, b] | InnoDB 默认,同时防止修改和插入幻行 |
| 插入意向锁 | Insert Intention Lock | 插入操作前加,与 Gap Lock 互斥 | 表示准备在间隙中插入 |
3. 按性质
- 共享锁(S锁,读锁):多事务可同时持有,阻塞写
- 排他锁(X锁,写锁):独占,阻塞其他读锁和写锁
Next-Key Lock 示例:
数据:id = 1, 5, 10, 15
索引范围及 Next-Key Lock 区间:
(-∞, 1] (1, 5] (5, 10] (10, 15] (15, +∞)
当前读 WHERE id = 5:
→ 对 (1, 5] 加 Next-Key Lock
→ 防止其他事务插入 id ∈ (1, 5] 的新行(防幻读)
→ 防止其他事务修改 id = 5 的行追问与易错
追问方向:
- 什么情况下行锁升级为表锁?
- 意向锁有什么作用?
- 怎么查看当前锁信息?
易错点:
- ❌ InnoDB 只有行锁——还有表锁(意向锁/AUTO-INC)
- ❌ 行锁锁的是行——锁的是索引记录
💡 记忆锚点
InnoDB 行锁三兄弟:记录锁锁一个点(防止改这行),间隙锁锁两点之间的空档(防止插新行),临键锁 = 点 + 左侧空档的前开后闭区间(默认锁法,既防改又防插)。记住:行锁锁的不是行而是索引记录,不走索引就退化成表锁。