前言
这里我们来看一下 mysql 这边的 元数据锁, 术语称之为 MDL
我们这里 忽略它的实现, 我们仅仅看 其具体的使用的地方
因为它的实现 也就可以理解为另外一个 表排他锁, 具体的实现来说 和表排他锁 类似
我们这里 仅仅去了解 在各种类型的语句中 MDL 的使用的地方
lock table, unlock table中 MDL 的使用
我们这里测试 执行sql如下
begin;
lock tables t_user_02 read;
unlock tables;
commit;
“lock table” 这边主要是涉及到 表的元数据锁 的获取
“unlock table” 这边主要是涉及到 表元数据锁 的释放
select 语句
select 这边也会涉及到 表元数据锁 的获取和释放
表元数据锁 的获取主要是在执行查询业务之前
表元数据锁 的释放主要是在执行业务查询之后, 本次命令执行完毕之前
update/delete 语句
update/delete 这边也会涉及到 表元数据锁 的获取和释放
调用的地方 和 select 的地方类似
create table 语句
在创建 数据表之前 获取 表元数据锁
然后在 语句执行完成的时候 释放 表元数据锁
alert table 语句
在更新 数据表之前 获取 表元数据锁
然后在 语句执行完成的时候 释放 表元数据锁
drop 语句
在删除 数据表之前 获取 表元数据锁
然后在 语句执行完成的时候 释放 表元数据锁
我们这里只重点关注 “lock table” + “unlock table”
获取表元数据锁 和 释放表元数据锁 是分开的, 这两个搭配在一起造成 获取元数据锁 阻塞的概率是最大的
完