🚪 MySQL 锁的详细分类(最全整理)
✅ 一、按锁的粒度(锁定范围)
粒度 |
锁类型 |
说明 |
表级锁 |
Table Lock |
锁住整张表,MyISAM/DDL |
行级锁 |
Row Lock |
锁住一行,InnoDB 支持 |
页级锁 |
Page Lock |
锁一页记录,BDB 引擎 |
元数据锁 |
Metadata Lock(MDL) |
锁表结构防止 DDL 冲突 |
意向锁 |
IS / IX |
表级辅助锁标记“我要加行锁” |
Auto-inc 锁 |
自增锁 |
控制 auto_increment 的并发安全 |
插入意向锁 |
插入意向(Insert Intention Lock) |
并发插入不同位置不会冲突的一种轻量锁 |
✅ 二、按操作行为(读/写)
行为 |
锁类型 |
描述 |
共享锁 |
S(Share) |
读锁,多个事务可并发读取 |
排他锁 |
X(Exclusive) |
写锁,修改必须独占 |
意向锁 |
IS/IX |
标记“我打算加读/写锁” |
Next-Key 锁 |
记录锁 + 间隙锁 |
防止幻读 |
Gap 锁 |
间隙,不锁记录 |
锁定索引区间,防止插入 |
Record 锁 |
单条记录锁 |
锁住实际行记录本身 |
临键锁 |
等价于 Next-Key 锁 |
常用于可重复读隔离级别 |
✅ 三、按加锁方式(显示/隐式)
类型 |
举例 SQL |
加锁说明 |
显式加锁 |
SELECT ... FOR UPDATE |
明确加锁语法 |
隐式加锁 |
UPDATE / INSERT / DELETE |
自动加锁 |
显式表锁 |
LOCK TABLES ... READ/WRITE |
手动控制表级锁 |
自动 MDL 锁 |
SELECT * FROM tbl |
普通查询也会自动加元数据锁 |
✅ 四、按加锁时机
加锁时机 |
锁类型 |
说明 |
语句开始时 |
显式锁、MDL |
如 SELECT ... FOR UPDATE 、ALTER TABLE |
执行过程中 |
行锁、间隙锁 |
DML 操作中自动产生 |
提交后释放 |
行锁、MDL 等 |
InnoDB 行锁随事务释放,MDL 随语句释放 |
✅ 五、按锁的持有时间
分类 |
锁类型 |
举例 / 说明 |
短事务锁 |
行锁、间隙锁 |
InnoDB 中事务控制的锁 |
长事务锁 |
表级锁、MDL |
未提交事务持有的锁 |
临时锁 |
插入意向锁 |
并发插入中的轻量锁 |
会话级锁 |
显式锁 |
LOCK TABLES 持有到 UNLOCK |
✅ 六、InnoDB 独有的内部锁(MVCC 下的逻辑锁)
类型 |
特点 / 说明 |
多版本并发控制(MVCC) |
实际是“伪锁”,通过隐藏字段 + undo log 实现 |
Undo Log + ReadView |
快照读依赖它实现“非阻塞读” |
当前读 / 快照读 |
当前读会加锁(如 FOR UPDATE ),快照读不会加锁(普通 SELECT ) |
✅ 七、DDL 操作相关锁
锁类型 |
场景 |
元数据锁(MDL) |
所有 SQL(读/写)都会自动加 |
自增锁(Auto-inc) |
insert 自动增长字段竞争 |
表锁 |
ALTER 、DROP 等语句会全表锁 |
📌 八、表锁 vs 行锁 vs 意向锁 的比较
类型 |
并发性能 |
粒度 |
适用场景 |
表锁 |
低 |
粗 |
MyISAM、DDL |
行锁 |
高 |
精细 |
InnoDB、事务 |
意向锁 |
辅助类型 |
表级 |
行锁前置,快速判断冲突 |
🔍 九、查看锁状态
SHOW ENGINE INNODB STATUS; -- 死锁、事务等待状态
SELECT * FROM information_schema.innodb_locks;
SELECT * FROM performance_schema.metadata_locks;
💡 十、易混锁类型重点对比
锁类型 |
锁定范围 |
是否防幻读 |
是否加锁 |
应用场景 |
Gap Lock |
间隙(不含记录) |
✅ |
✅ |
防止插入 |
Record Lock |
记录本身 |
❌ |
✅ |
修改或精确查找 |
Next-Key Lock |
间隙 + 记录 |
✅ |
✅ |
默认 RR 下 select for update |
Insert Intention Lock |
插入点的轻量锁 |
❌ |
自动 |
并发 insert 安全 |
🎯 十一、实际开发中注意事项
确保 WHERE 子句使用索引,否则可能锁整张表;
事务处理要及时提交,否则行锁长时间占用容易死锁;
SELECT 语句默认不加锁! 若要加锁需显式指定;
索引设计不当,Next-Key 锁可能扩大锁范围;
并发 INSERT 时,插入意向锁避免了 insert 死锁;
MVCC 的快照读性能高但不能用于更新场景;
DDL 要避开业务高峰期,否则 MDL 锁阻塞严重;
🧠 十二、知识图谱
MySQL 锁体系
├── 粒度
│ ├── 表级锁(Table Lock)
│ ├── 行级锁(Row Lock)
│ ├── 页级锁(Page Lock)
│ └── 元数据锁(MDL)
├── 类型
│ ├── 共享锁(S) / 排他锁(X)
│ ├── 意向锁(IS/IX)
│ ├── 间隙锁 / 记录锁 / Next-Key
│ ├── 插入意向锁 / 自增锁
│ └── MVCC(伪锁)
├── 场景
│ ├── SELECT / FOR UPDATE / INSERT
│ ├── ALTER / DROP / CREATE
│ └── 显式锁(LOCK TABLES)
├── 查看工具
│ ├── SHOW ENGINE INNODB STATUS
│ ├── information_schema.innodb_locks
│ └── performance_schema.metadata_locks