1、MDL类型
锁名称 |
锁类型 |
说明 |
适用语句 |
MDL_INTENTION_EXCLUSIVE |
共享锁 |
意向锁,锁住一个范围 |
任何语句都会获取MDL意向锁, 然后再获取更强级别的MDL锁。 |
MDL_SHARED |
共享锁,表示只访问表结构 |
|
|
MDL_SHARED_HIGH_PRIO |
共享锁,只访问表结构 |
show create table 等 只访问INFORMATION_SCHEMA的语句 |
|
MDL_SHARED_READ |
访问表结构并且读表数据 |
select语句 LOCK TABLE ... READ |
|
MDL_SHARED_WRITE |
访问表结构并且写表数据 |
SELECT ... FOR UPDATE DML语句 |
|
MDL_SHARED_UPGRADABLE |
可升级锁,访问表结构并且读写表数据 |
Alter语句中间过程会使用 |
|
MDL_SHARED_NO_WRITE |
可升级锁,访问表结构并且读写表数据,并且禁止其它事务写。 |
Alter语句中间过程会使用 |
|
MDL_SHARED_NO_READ_WRITE |
可升级锁,访问表结构并且读写表数据,并且禁止其它事务读写。 |
LOCK TABLES ... WRITE |
|
MDL_EXCLUSIVE |
写锁 |
禁止其它事务读写。 |
CREATE/DROP/RENAME TABLE等DDL语句。 |
2.按对象/范围维度划分
属性 |
含义 |
范围/对象 |
GLOBAL |
全局锁 |
范围 |
COMMIT |
提交保护锁 |
范围 |
SCHEMA |
库锁 |
对象 |
TABLE |
表锁 |
对象 |
FUNCTION |
函数锁 |
对象 |
PROCEDURE |
存储过程锁 |
对象 |
TRIGGER |
触发器锁 |
对象 |
EVENT |
事件锁 |
对象 |
3.按请求/释放锁持续时间划分
属性 |
含义 |
MDL_ STATEMENT |
语句级别 |
MDL_TRANSACTION |
事务级别 |
MDL_EXPLICIT |
需要显示释放 |
4.范围锁的兼容性矩阵
5、对于INSERT INTO T SELECT ... FROM S WHERE ...
在RR隔离级别下,会对S表查到的行执行lock next-key;在RC隔离级别下,则不会加锁。