MySQL 锁
hardMySQL锁行锁表锁间隙锁Next-Key Lock
锁的分类
按粒度
| 锁类型 | 粒度 | 并发度 | 开销 | 死锁 |
|---|---|---|---|---|
| 表锁 | 整张表 | 低 | 小 | 不会 |
| 行锁 | 单行记录 | 高 | 大 | 可能 |
InnoDB 支持行级锁,MyISAM 只支持表级锁。
按模式
| 锁 | 说明 | 兼容性 |
|---|---|---|
| 共享锁 (S) | 读锁,允许其他事务同时读 | S 与 S 兼容 |
| 排他锁 (X) | 写锁,独占,不允许其他任何锁 | X 与任何锁都冲突 |
-- 加共享锁
SELECT * FROM users WHERE id=1 LOCK IN SHARE MODE;
-- 加排他锁
SELECT * FROM users WHERE id=1 FOR UPDATE;
InnoDB 行锁的三种算法
1. 记录锁(Record Lock)
锁住索引中的一条记录:
WHERE id = 5 → 只锁 id=5 这一行
2. 间隙锁(Gap Lock)
锁住索引记录之间的间隙,防止其他事务在间隙中插入新记录(解决幻读):
索引中有: 3, 7, 10
Gap Lock (3, 7): 阻止插入 id=4,5,6 的记录
3. Next-Key Lock
Record Lock + Gap Lock,锁住记录本身及之前的间隙。这是 InnoDB 在 RR 隔离级别下的默认行锁算法:
索引中有: 3, 7, 10
Next-Key Lock 7: 锁住 (3, 7] (左开右闭)
加锁规则(简化)
查询条件 加锁类型
───────────────────────────
等值查询命中记录 Record Lock(退化,不加 Gap)
等值查询未命中 Gap Lock
范围查询 Next-Key Lock
生产高频题
MySQL 有哪些锁?
按粒度分:表锁、行锁。按模式分:共享锁(S/读锁)、排他锁(X/写锁)。InnoDB 行锁有三种算法:记录锁、间隙锁、Next-Key Lock。
间隙锁的作用?
在 RR 隔离级别下,间隙锁锁住索引记录之间的间隙,防止其他事务在该范围内插入新记录,从而解决幻读问题。