MySQL 核心模块揭秘 | 16 期 | InnoDB 表锁
目录
1. 概述
2. 共享锁 & 排他锁
3. 意向共享锁 & 意向排他锁
4. AUTO-INC 锁
4.1 传统模式
4.2 连续模式
4.3 交错模式
5. 总结
正文
1. 概述
MySQL 采用插件化存储引擎,从这个角度,整体结构可以分为两层:
- server 层。
- 存储引擎。
基于以上两层结构,MySQL 的锁也可以分为两大类。
server 层的锁,就是让我们头痛不已的元数据锁(MDL)。
存储引擎的锁,取决于各存储引擎的实现。
InnoDB 支持表锁、行锁、谓词锁(用于空间索引,我们不会介绍)。
表锁分为共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX)、AUTO-INC 锁。
行锁分共享锁(S)、排他锁(X),以及有点特殊的插入意向锁(LOCK_INSERT_INTENTION
)。
行级别共享锁(S)和排他锁(X)又都可以细分为三类:
- 普通记录锁(LOCK_REC_NOT_GAP)。
- 间隙锁(LOCK_GAP)。
- Next-Key 锁(LOCK_ORDINARY)。
接下来,我们就进入本文的主题,聊聊 InnoDB 的表锁。
2. 共享锁 & 排他锁
顾名思义,共享锁指的是多个事务可以同时对同一个表加的锁,排他锁指的是同一时刻只有一个事务能对某个表加的锁。
如果事务 T 想要读取某个表的数据,同时允许其它事务读取这个表的数据,但是不允许其它事务改变这个表的数据,事务 T 可以对这个表加表级别的共享锁。
如果事务 T 想要改变(插入、更新、删除)某个表的数据,并且不允许其它任何事务读取或者改变(插入、更新、删除)这个表的数据,事务 T 可以对这个表加表级别的排他锁。
了解定义之后,我们再来看看怎么加表级别的共享锁和排他锁。
以给 t1 表加表级别的共享锁为例,先执行以下 SQL 加锁:
lock tables t1 read;<br>