元数据锁(简称MDL)

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

 

元数据锁的作用: 为了避免DDL与DML冲突,保证读写的正确性 DDL语句的作用: 对数据库对象(数据库、表、列、索引等)进行创建、删除、修改 DML语句的作用: 用于添加、修改、删除和查询数据库记录,并检查数据完整性

 

什么是元数据 简单理解为就是表结构,当某张表存在未提交的事务,那么我们不能修改这张表的表结构

 

在MySQL5.5中引入了MDL 当对一张表进行增删改查的时候,会自动加MDL读锁,读锁之间可以兼容 当对表结构进行变更操作的时候,会自动加MDL写锁,写锁之间不可以兼容,写锁与读锁之间也不可以兼容 如下表格

对应SQL锁类型说明
lock tables xxx read/writeSHARED_READ_ONLY / SHARED_READ_WRITE
select、select...lock in share modeSHARED_READ与SHARED_READ、SHARED_WRITE兼容,与EXCLUSIVE互斥
insert、update、delete、select...for updateSHARED_WRITE与SHARED_READ、SHARED_WRITE兼容,与EXCLUSIVE互斥
alter table ...EXCLUSIVE与其他的MDL都互斥

主要看上面表格的下三行。上面的SHARED_READ是读锁,SHARED_WRITE是写锁,EXCLUSIVE是排他锁

 

如何查看元数据锁