MySQL 锁到底有哪些?一张表搞懂所有锁,再也不懵
只要做后端、高并发、事务,MySQL 锁就是绕不开的高频考点 + 踩坑重灾区。
死锁、锁等待、并发卡顿、更新错乱,90% 都是没弄懂锁的类型。
这篇用人话把 MySQL 所有锁一次性讲清,不绕、不晦涩。
一、按锁粒度划分(最核心分类)
1. 全局锁
锁住整个数据库实例,整个库只能读,不能写。
- 场景:全库备份
- 特点:粒度最大,并发极差
2. 表级锁
锁住整张表,其他事务不能读写。
- 优点:加锁快、无死锁
- 缺点:并发性能差
- MyISAM 默认、InnoDB 也会出现
3. 行级锁
只锁住某一行数据,其他行不受影响。
- 优点:并发极高
- 缺点:加锁慢,可能出现死锁
- InnoDB 最常用
二、按操作性质划分
1. 共享锁(S 锁 / 读锁)
- 允许多个事务同时加读锁
- 加了读锁,不能加写锁
- 语法:SELECT ... LOCK IN SHARE MODE
2. 排他锁(X 锁 / 写锁)
- 只有一个事务能持有
- 加了写锁,其他读写都阻塞
- 增删改默认自动加排他锁
- 语法:SELECT ... FOR UPDATE
三、按实现机制划分(InnoDB 重点)
1. 记录锁(Record Lock)
锁住某一行具体记录,锁住索引记录。
2. 间隙锁(Gap Lock)
锁住索引之间的空隙,防止插入数据,解决幻读。
3. 临键锁(Next-Key Lock)
记录锁 + 间隙锁,左开右闭区间,
InnoDB RR 隔离级别默认锁,彻底防幻读。
四、其他常见锁
1. 意向锁
表级锁,用来快速判断表里有没有行被锁,提升效率。
2. 自增锁
针对自增主键,保证 ID 连续不重复。
3. 死锁
两个事务互相持有对方需要的锁,互相等待,卡死。
五、一张表秒懂所有锁
表格
锁类型 | 粒度 | 特点 | 适用场景 |
全局锁 | 整个库 | 全库只读 | 全库备份 |
表锁 | 整张表 | 快、并发低 | 低并发、批量操作 |
行锁 | 单行 | 并发高、可能死锁 | 高并发业务 |
共享锁
| 行 / 表 | 可读不可写 | 多读少写 |
排他锁 | 行 / 表 | 独占读写 | 增删改 |
记录锁 | 单行索引 | 锁具体记录 | 精准更新 |
间隙锁 | 索引间隙 | 防插入 | 防幻读 |
临键锁 | 区间 | 行锁 + 间隙锁 | RR 级别默认 |
六、极简总结(面试直接背)
- InnoDB 支持表锁 + 行锁,默认行锁
- 读锁共享,写锁排他
- 临键锁 = 记录锁 + 间隙锁,用来防幻读
- 没索引会导致行锁升级成表锁,并发爆炸
- 锁粒度越小,并发越高,越容易死锁
心有所向,日复一日,深耕不辍,终能光芒万丈。
文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有
