持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 4 天,点击查看活动详情
哈喽,大家好我是二毛,学 Mysql 的时候,经常看到各种锁,时不时会混淆,很容易给整蒙圈,今天爬上来进行总结一波,这次先按照加锁的范围维度。
全局锁
执行命令:
加锁:flush tables with read lock 释放:unlock tables
整个数据库就处于只读状态了,以下都会阻塞:
对数据的增删改操作,比如 insert、delete、update等语句;
对表结构的更改操作,比如 alter table、drop 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 的组合,锁定一个范围,并且锁定记录本身。左开右闭区间
我是二毛,我们下期再见~