MDL锁介绍
MySQL中表级别的锁有两种:一种是表锁,一种是元数据锁(MDL)。
MDL不需要显式使用,在访问一个表的时候会被自动加上。其中有MDL读锁(对表中数据做增删改查操作),MDL写锁(对表做结构变更操作).
还原事故
在Navicat中,
会话1:
begin;
SELECT * FROM test
;
会话2:
SELECT * FROM test
;
会话3:
alter table test add t1 varchar(20);在事务没有commit之前,之后的所有操作全部阻塞,影响到线上业务。
会话4:
SELECT * FROM test
; 阻塞
解决
当将会话1 当中的事务提交之后,会话3就会获取MDL写锁,从而正常执行。
本质上还是 长事务问题 ,事务不提交,就会一直占着MDL锁。所有在执行前可以在MySQL的information_schema 库的 innodb_trx 表中进行查询,有没有当前正在执行的事务。如果有的话,那就先考虑先暂停DDL,或者kill掉这个长事务。