面试官:按范围维度总结 Mysql 的各种锁

163 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 4 天,点击查看活动详情

哈喽,大家好我是二毛,学 Mysql 的时候,经常看到各种锁,时不时会混淆,很容易给整蒙圈,今天爬上来进行总结一波,这次先按照加锁的范围维度。

全局锁

执行命令:

加锁:flush tables with read lock  
  
释放:unlock tables

整个数据库就处于只读状态了,以下都会阻塞:

对数据的增删改操作,比如 insertdeleteupdate等语句;

对表结构的更改操作,比如 alter tabledrop table 等语句。

表级锁

表锁

表级别的共享锁,也就是读锁; ​lock tables t_student read;

表级别的独占锁,也就是写锁; ​lock tables t_stuent wirte;

元数据锁(MDL)

我们不需要显示的使用 MDL,因为当我们对数据库表进行操作时,会自动给这个表加上 MDL:

  •  对一张表进行 CRUD 操作时,加的是 MDL 读锁;

  •  对一张表做结构变更操作的时候,加的是 MDL 写锁;

意向锁

也就是,当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。 

而普通的 select 是不会加行级锁的,普通的 select 语句是利用 MVCC 实现一致性读,是无锁的。 

不过,select 也是可以对记录加共享锁和独占锁的,具体方式如下:

先在表上加上意向共享锁,然后对读取的记录加共享锁
​select ... lock in share mode; ​​

先表上加上意向独占锁,然后对读取的记录加独占锁
​select ... for update;

行级锁

Record Lock

记录锁,也就是仅仅把一条记录锁上

Gap Lock

间隙锁,锁定一个范围,但是不包含记录本身;左开右开区间

Next-Key Lock

Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。左开右闭区间

我是二毛,我们下期再见~