MySQL 锁

发布于:2025-07-03 ⋅ 阅读:(16) ⋅ 点赞:(0)

🚪 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 UPDATEALTER 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 自动增长字段竞争
表锁 ALTERDROP 等语句会全表锁

📌 八、表锁 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 安全

🎯 十一、实际开发中注意事项

  1. 确保 WHERE 子句使用索引,否则可能锁整张表;

  2. 事务处理要及时提交,否则行锁长时间占用容易死锁;

  3. SELECT 语句默认不加锁! 若要加锁需显式指定;

  4. 索引设计不当,Next-Key 锁可能扩大锁范围

  5. 并发 INSERT 时,插入意向锁避免了 insert 死锁

  6. MVCC 的快照读性能高但不能用于更新场景

  7. 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


网站公告

今日签到

点亮在社区的每一天
去签到