旦申请到
MDL
锁后,直到事务执行完才会将锁释放。(这里有种特殊情况如果
事务中包含
DDL
操作,
mysql
会在
DDL
操作语句执行前,隐式提交
commit
,
以保证该
DDL
语句操作作为一个单独的事务存在,同时也保证元数据排他锁的
释放)。
注: 支持事务的
InnoDB
引擎表和不支持事务的
MyISAM
引擎表,都会出现
Metadata Lock Wait
等待现象。一旦出现
Metadata Lock Wait
等待现象,后续
所有对该表的访问都会阻塞在该等待上,导致连接堆积,业务受影响。
2.
模拟与查找
MDL
锁
MDL
锁通常发生在
DDL
操作挂起的时候,原因是有未提交的事务对该表进行
DML
操作。而
MySQL
的会话那么多,不知道哪个会话的操作没有及时提交影
响了
DDL
。通常我们排查这类问题,往往需要从
information_schema.innodb_trx
表中查询当前在执行的事务,但当
SQL
已经执
行过了,没有
commit
,这个时候这个表中是看不到
SQL
的。
在
MySQL5.7
中,
performance_schema
库中新增了
metadata_locks
表,专门
记录
MDL
的相关信息。首先要开启
MDL
锁记录,执行如下
SQL
开启:
1.
UPDATE performance_schema.setup_instruments
2.
SET ENABLED = 'YES', TIMED = 'YES'
3.
WHERE NAME = 'wait/lock/metadata/sql/mdl';
下面展示下模拟及查找
MDL
锁的过程:
1.
#
会话
1
事务中执行
DML
操作
2.
mysql> begin;
3.
Query OK, 0 rows affected (0.00 sec)
评论