前言

这里我们来看一下 mysql 这边的 元数据锁, 术语称之为 MDL

我们这里 忽略它的实现, 我们仅仅看 其具体的使用的地方

因为它的实现 也就可以理解为另外一个 表排他锁, 具体的实现来说 和表排他锁 类似

我们这里 仅仅去了解 在各种类型的语句中 MDL 的使用的地方 

 

 

lock table, unlock table中 MDL 的使用 

我们这里测试 执行sql如下

begin;
lock tables t_user_02 read;
unlock tables;
commit;

 

“lock table” 这边主要是涉及到 表的元数据锁 的获取

65 mysql 的 表元数据锁_sql

 

“unlock table” 这边主要是涉及到 表元数据锁 的释放

65 mysql 的 表元数据锁_元数据_02

 

 

select 语句

select 这边也会涉及到 表元数据锁 的获取和释放

表元数据锁 的获取主要是在执行查询业务之前

65 mysql 的 表元数据锁_mysql_03

 

表元数据锁 的释放主要是在执行业务查询之后, 本次命令执行完毕之前 

65 mysql 的 表元数据锁_mysql_04

 

 

update/delete 语句

update/delete 这边也会涉及到 表元数据锁 的获取和释放

调用的地方 和 select 的地方类似 

65 mysql 的 表元数据锁_sql_05

 

 

create table 语句 

在创建 数据表之前 获取 表元数据锁

然后在 语句执行完成的时候 释放 表元数据锁

65 mysql 的 表元数据锁_mdl_06

 

 

alert table 语句

在更新 数据表之前 获取 表元数据锁

然后在 语句执行完成的时候 释放 表元数据锁

65 mysql 的 表元数据锁_mysql_07

 

 

drop 语句

在删除 数据表之前 获取 表元数据锁

然后在 语句执行完成的时候 释放 表元数据锁

65 mysql 的 表元数据锁_mdl_08

 

 

我们这里只重点关注 “lock table” + “unlock table”

获取表元数据锁 和 释放表元数据锁 是分开的, 这两个搭配在一起造成 获取元数据锁 阻塞的概率是最大的