260328
MySQL 锁分类
MySQL 锁按锁粒度、锁模式、实现机制、并发思想四大维度划分,主流 InnoDB 引擎下核心锁类型如下:
一、按锁粒度(作用范围)
1. 全局锁(Global Lock)
- 锁定整个数据库实例,所有表只读、不可写
- 命令:
FLUSH TABLES WITH READ LOCK(FTWRL) - 场景:全库逻辑备份、主从切换
2. 表级锁(Table Lock)
- 锁定整张表,粒度大、开销小、并发低
- 子类型:
- 表读锁(共享):
LOCK TABLES ... READ - 表写锁(排他):
LOCK TABLES ... WRITE - 元数据锁(MDL):保护表结构,DDL/DML 自动加
- 意向锁(IS/IX):InnoDB 表级意向,兼容行锁
- 表读锁(共享):
- 引擎:MyISAM、InnoDB(无索引时退化为表锁)
3. 行级锁(Row Lock)
- 锁定单行,粒度最小、并发最高,InnoDB 核心
- 依赖索引实现,无索引会全表加锁
4. 页级锁(Page Lock)
- 锁定 16KB 数据页,仅 BDB 引擎(已淘汰)
二、按锁模式(读写兼容性)
1. 共享锁(S 锁 / 读锁)
- 允许多事务读,阻塞写
- 语法:
SELECT ... LOCK IN SHARE MODE
2. 排他锁(X 锁 / 写锁)
- 独占读写,阻塞其他 S/X 锁
- 语法:
SELECT ... FOR UPDATE、INSERT/UPDATE/DELETE自动加
三、InnoDB 行锁算法(解决幻读)
1. 记录锁(Record Lock)
- 锁定单行索引记录,防更新/删除
2. 间隙锁(Gap Lock)
- 锁定索引区间(不含记录),防插入
3. 临键锁(Next-Key Lock)
- 记录锁 + 间隙锁,InnoDB 默认(RR 隔离级别),防幻读
4. 插入意向锁(Insert Intention Lock)
- 间隙锁变种,多事务并发插入同一间隙不阻塞
四、特殊锁
1. 自增锁(AUTO-INC Lock)
- 保证自增列唯一,批量插入时表级锁
2. 乐观锁(应用层)
- 无数据库锁,用版本号/时间戳在更新时校验冲突
五、核心分类速览
| 维度 | 主要类型 | 核心引擎 | 特点 |
|---|---|---|---|
| 粒度 | 全局锁、表锁、行锁、页锁 | 全引擎、InnoDB/MyISAM、InnoDB、BDB | 粒度越大并发越低 |
| 模式 | 共享锁(S)、排他锁(X) | InnoDB | 读共享、写互斥 |
| 行锁算法 | 记录锁、间隙锁、临键锁 | InnoDB | 解决幻读 |
| 思想 | 悲观锁(数据库)、乐观锁(应用) | 全引擎 | 悲观加锁、乐观校验 |
什么是记录锁?
一、什么是 InnoDB 记录锁(Record Lock)
记录锁是 InnoDB 行锁的一种,锁定索引里的某一条具体记录(行),只锁住命中的单行,不锁间隙、不锁整张表。
前提:走精准索引匹配(唯一索引/主键等值查询),RR/RC 隔离级都生效。
二、核心特点
锁对象:索引物理行记录
- InnoDB 行锁本质是「锁索引」,不是锁数据行
触发条件:等值精准命中唯一索引/主键,只锁定匹配到的那一行
兼容性:
- 记录 S 锁(共享):其他事务可读,阻塞写/删
- 记录 X 锁(排他):其他事务读写都阻塞
无间隙锁定:只锁当前行,不会阻挡区间插入(和间隙锁/临键锁区分)
三、SQL 示例演示
表结构:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 皖月清风的个人博客!
评论




