MySQL 锁的分类
MySQL 中的锁机制是保证数据一致性和并发控制的关键,主要可以分为以下几大类:
1. 按锁的粒度分类
(1) 全局锁
- FLUSH TABLES WITH READ LOCK (FTWRL)
- 锁定整个数据库实例
- 主要用于备份操作
(2) 表级锁
- 表锁:锁定整张表
- 共享锁(S锁)
- 排他锁(X锁)
- 元数据锁(MDL)
- 自动加锁,防止DDL操作导致的问题
- DDL 定义数据结构(创建/修改表等),如
CREATE TABLE
、ALTER TABLE
、DROP TABLE
(3) 行级锁
- 记录锁(Record Lock)
- 锁定索引记录
- 间隙锁(Gap Lock)
- 锁定索引记录间的间隙
- 临键锁(Next-Key Lock)
- 记录锁+间隙锁的组合
- 插入意向锁(Insert Intention Lock)
- 特殊的间隙锁
2. 按锁的兼容性分类
(1) 共享锁(S锁)
- 读锁,允许多个事务同时读取
- 语法:
SELECT ... LOCK IN SHARE MODE
(8.0+使用FOR SHARE
)
(2) 排他锁(X锁)
- 写锁,独占锁
- 语法:
SELECT ... FOR UPDATE
3. 按锁的实现方式分类
(1) 悲观锁
- 默认锁定机制
- 先加锁再操作
(2) 乐观锁
- 不加锁,通过版本号控制
- 需要应用层实现
4. 意向锁(Intention Lock)
- 意向共享锁(IS)
- 意向排他锁(IX)
- 表级锁,表示事务有意向在表中的行上获取锁
5. 自增锁(AUTO-INC Lock)
- 特殊表级锁,用于自增列
6. 死锁
- 多个事务互相等待对方释放锁
- InnoDB会自动检测并回滚代价较小的事务
不同存储引擎的锁支持
存储引擎 | 表锁 | 行锁 | 页锁 |
---|---|---|---|
InnoDB | 支持 | 支持 | 不支持 |
MyISAM | 支持 | 不支持 | 不支持 |
BDB | 支持 | 不支持 | 支持 |
实际应用中,InnoDB的行级锁和MVCC机制提供了良好的并发性能,而MyISAM仅支持表锁,在高并发场景下性能较差。
全表行三粒度,读共写独两相异,悲锁先占乐后验,意向自增有玄机
全局锁像封城,表锁像会议室,行锁像占座,
意向锁是预告,自增锁是发号,死锁是堵车!
悲观锁先抢再干,乐观锁先干再验!