【MySQL】锁 —— 表级锁 —— 元数据锁

一、介绍

meta data lock , 元数据锁,简写MDL。

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。元数据可以简单理解为表结构,MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。

简单说:如果某张表存在未提交的事物,那么我们是不能去修改这张表的表结构。

作用:为了避免DML与 DDL冲突,保证读写的正确性。

这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。

在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变 更操作的时候,加MDL写锁(排他)。读锁之间是可以兼容的,但是写锁之间以及写锁和读锁之间是互斥的。

常见的SQL操作时,所添加的元数据锁:

对应SQL锁类型说明
lock tables xxx read / writeSHARED_READ_ONLY / SHARED_NO_READ_WRITE
select 、select … lock in share mode(共享锁)SHARED_READ与 SHARED_READ、SHARED_WRITE 兼容,与 EXCLUSIVE 互斥
insert 、update、delete、select … for updateSHARED_WRITE与 SHARED_READ、SHARED_WRITE 兼容,与 EXCLUSIVE 互斥
alter table …EXCLUSIVE与其他的 MDL 都互斥

那也就是说 SHARED_READSHARED_WRITE 是兼容的,但是 SHARED_READSHARED_WRITEEXCLUSIVE 是互斥的。


二、演示

当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHARED_READ / SHARED_WRITE),之间是兼容的,所以两个客户端你怎么执行都可以。

image-20240720220802241

当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁 (EXCLUSIVE),之间是互斥的。

image-20240720220822889

我们可以通过下面的SQL,来查看数据库中的元数据锁的情况:

这条SQL语句实际上查询的是系统表中的matedata_locaks表,这张表就记录了我们当前数据库实例中的元数据锁。

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;

我们在操作过程中,可以通过上述的SQL语句,来查看元数据锁的加锁情况。

image-20240720220855664

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值