Metadata Lock 的作用:
要直接说出Metadata Lock 的作用、以我目前的文字功底是不行的、好在我可以通过一个例子来说明。
假设session 1 在正在执行如下的SQL语句
select * from t ;
session 2 想要执行
drop table t;
drop table t ; 这句SQL是不能得到马上执行的、因为session 1 还用着t表。
Metadata Lock 是为了防止在有dml执行的过程中,有ddl修改dml中用到的对象,所以不管是dml还是ddl
在执行前都要得到语句所涉及对象的Metadata Lock ;不同的是dml要得到的是S锁、而ddl是X锁。
上面的例子中通过show processlist 可以看到如下内容
show processlist; +----+-------------+-----------+--------+---------+------+---------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+--------+---------+------+---------------------------------+------------------+ | 1 | jianglexing | localhost | tempdb | Sleep | 23 | | NULL | | 2 | jianglexing | localhost | tempdb | Query | 11 | Waiting for table metadata lock | drop table t | | 3 | jianglexing | localhost | NULL | Query | 0 | starting | show processlist | +----+-------------+-----------+--------+---------+------+---------------------------------+------------------+
Metadata Lock 的作用范围:
所在数据库中的对象、如 table、schema、trigger ...
----------------------------------------------------------------------------------------------