元数据锁(简称MDL)
MDL加锁过程是系统自动控制的,无需显式使用,在访问一张表的时候,元数据锁会自动加上。MDL锁主要作用是 维护表元数据的数据一致性。在表上有活动事务的时候,不可以对元数据进行写入操作
元数据锁的作用: 为了避免DDL与DML冲突,保证读写的正确性 DDL语句的作用: 对数据库对象(数据库、表、列、索引等)进行创建、删除、修改 DML语句的作用: 用于添加、修改、删除和查询数据库记录,并检查数据完整性
什么是元数据 简单理解为就是表结构,当某张表存在未提交的事务,那么我们不能修改这张表的表结构
在MySQL5.5中引入了MDL 当对一张表进行增删改查的时候,会自动加MDL读锁,读锁之间可以兼容 当对表结构进行变更操作的时候,会自动加MDL写锁,写锁之间不可以兼容,写锁与读锁之间也不可以兼容 如下表格
对应SQL | 锁类型 | 说明 |
---|---|---|
lock tables xxx read/write | SHARED_READ_ONLY / SHARED_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是写锁,EXCLUSIVE是排他锁
如何查看元数据锁
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;