show processlist
1、作用
MySQL5.5 引入,用于解决或者保证DDL操作与DML操作之间的一致性
所以MDL锁是在Server级别的锁
2、对象
可以是表锁,也可以是全局锁、库级别的锁、表空间级别的锁
某些类型的MDL锁会从上往下一层层进行加锁。比如LOCK TABLE … WRITE这样的SQL语句,其首先会对GLOBAL级别加INTENTION_EXCLUSIVE锁,再对SCHEMA级别加INTENTION_EXCLUSIVE锁,最后对TABLE级别加SHARED_NO_READ_WRITE锁。
3、锁模式
锁模式 简称 对应SQL 备注
MDL_INTENTION_EXCLUSIVE IX GLOBAL对象、SCHEMA对象操作会加此锁
意向X锁,只用于scope 锁
MDL_SHARED S FLUSH TABLES with READ LOCK,
只能读metadata,当能读写数据,如检查表是否存在时用这个锁
MDL_SHARED_WRITE_LOW_PRIO SWL 仅对MyISAM存储引擎有效
MDL_SHARED_HIGH_PRIO SH 仅对MyISAM存储引擎有效
高优先级S锁,可以抢占X锁,只能读metadata,不能读写数据,用于填充INFORMATION_SCHEMA,或者show create table时
MDL_SHARED_READ SR SELECT查询,DML共享
可以读表数据,select语句,lock table xxx read 都用这个
MDL_SHARED_WRITE SW DML独占锁
可以更新表数据,insert,update,delete,lock table xxx write, select for update
MDL_SHARED_UPGRADABLE SU ALTER TABLE
可升级锁,可以升级为SNW或者X锁,ALTER TABLE第一阶段会用到
MDL_SHARED_READ_ONLY SRO LOCK xxx READ
SRO阻塞SW,SNRW,X
MDL_SHARED_NO_WRITE SNW
可升级锁,其它线程能读metadata,数据可读不能读,持锁者可以读写,可以升级成X锁,ALTER TABLE的第一阶段
MDL_SHARED_NO_READ_WRITE SNRW lock tables write
可升级锁,其它线程能读metadata,数据不能读写,持锁者可以读写,可以升级成X锁,LOCK TABLES xxx WRITE
MDL_EXCLUSIVE X ALTER TABLE xxx PARTITION BY …
排它锁,禁止其它线程的所有请求,CREATE/DROP/RENAME TABLE
4、LOCK_DURATION
MDL_STATEMENT
语句范围的,语句结束自动释放
MDL_TRANSACTION
事务范围的,事务结束时自动释放
MDL_EXPLICIT
显式锁,由lock tables xxx read 这种获取,需要通过unlock tables释放
5、LOCK_STATUS
GRANTED 当请求并立即获得元数据锁定
PENDING 当请求元数据锁定而不立即获取
VICTIM 当死锁检测器取消挂起的锁定请求以打破死锁时,其行状态将从更新 PENDING 为 VICTIM 。
KILLED 当准予的锁定或挂起的锁请求被杀
PRE_ACQUIRE_NOTIFY,POST_RELEASE_NOTIFY 表示该元数据锁定subsubsystem的通知感兴趣的存储引擎,而进入锁定获取操作或离开锁释放操作。