一、介绍
meta data lock
, 元数据锁,简写MDL。
MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。元数据可以简单理解为表结构,MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。
简单说:如果某张表存在未提交的事物,那么我们是不能去修改这张表的表结构。
作用:为了避免DML与 DDL冲突,保证读写的正确性。
这里的元数据,大家可以简单理解为就是一张表的表结构。 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。
在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变 更操作的时候,加MDL写锁(排他)。读锁之间是可以兼容的,但是写锁之间以及写锁和读锁之间是互斥的。
常见的SQL操作时,所添加的元数据锁:
对应SQL | 锁类型 | 说明 |
---|---|---|
lock tables xxx read / write | SHARED_READ_ONLY / SHARED_NO_READ_WRITE | |
select 、select … lock in share mode(共享锁) | SHARED_READ | 与 SHARED_READ、SHARED_WRITE 兼容,与 EXCLUSIVE 互斥 |
insert 、update、delete、select … for update | SHARED_WRITE | 与 SHARED_READ、SHARED_WRITE 兼容,与 EXCLUSIVE 互斥 |
alter table … | EXCLUSIVE | 与其他的 MDL 都互斥 |
那也就是说 SHARED_READ
与 SHARED_WRITE
是兼容的,但是 SHARED_READ
、SHARED_WRITE
和 EXCLUSIVE
是互斥的。
二、演示
当执行SELECT、INSERT、UPDATE、DELETE等语句时,添加的是元数据共享锁(SHARED_READ / SHARED_WRITE),之间是兼容的,所以两个客户端你怎么执行都可以。
当执行SELECT语句时,添加的是元数据共享锁(SHARED_READ),会阻塞元数据排他锁 (EXCLUSIVE),之间是互斥的。
我们可以通过下面的SQL,来查看数据库中的元数据锁的情况:
这条SQL语句实际上查询的是系统表中的matedata_locaks表,这张表就记录了我们当前数据库实例中的元数据锁。
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
我们在操作过程中,可以通过上述的SQL语句,来查看元数据锁的加锁情况。