MySQL MDL类型和兼容矩阵
MySQL MDL类型和兼容矩阵
锁名称 | 锁类型 | 说明 | 适用语句 |
MDL_INTENTION_EXCLUSIVE(IX) | 共享锁 | 意向锁,锁住一个范围 |
任何语句都会获取MDL意向锁, 然后再获取更强级别的MDL锁。 |
MDL_SHARED(S) | 共享锁,表示只访问表结构 | ||
MDL_SHARED_HIGH_PRIO(SH) | 共享锁,只访问表结构 |
show create table 等 只访问INFORMATION_SCHEMA的语句 |
|
MDL_SHARED_READ(SR) | 访问表结构并且读表数据 |
select语句LOCK TABLE ... READ |
|
MDL_SHARED_WRITE(SW) | 访问表结构并且写表数据 |
SELECT ... FOR UPDATE DML语句 |
|
MDL_SHARED_WRITE_LOW_PRIO(SWLP) | |||
MDL_SHARED_UPGRADABLE(SU) | 可升级锁,访问表结构并且读写表数据 | Alter语句中间过程会使用 | |
MDL_SHARED_READ_ONLY(SRO) | |||
MDL_SHARED_NO_WRITE(SNW) | 可升级锁,访问表结构并且读写表数据,并且禁止其它事务写 | Alter语句中间过程会使用 | |
MDL_SHARED_NO_READ_WRITE(SNRW) | 可升级锁,访问表结构并且读写表数据,并且禁止其它事务读写 | LOCK TABLES ... WRITE | |
MDL_EXCLUSIVE(X) | 写锁 | 禁止其它事务读写 | CREATE/DROP/RENAME TABLE等DDL语句。 |
其中,引用https://dev.mysql.com/doc/refman/8.0/en/performance-schema-metadata-locks-table.html的一段内容:
LOCK_TYPE:The lock type from the metadata lock subsystem. The value is one of
INTENTION_EXCLUSIVE
,SHARED
,SHARED_HIGH_PRIO
,SHARED_READ
,SHARED_WRITE
,SHARED_UPGRADABLE
,SHARED_NO_WRITE
,SHARED_NO_READ_WRITE
, orEXCLUSIVE
.
lock_type官网给的类型刚好对应了上述表格中除了SWLP和SRO之外的其他类型。
MDL的兼容性矩阵(对象维度):
Request | Granted requests for lock | type | S SH SR SW SWLP SU SRO SNW SNRW X | ----------+---------------------------------------------+ S | + + + + + + + + + - | SH | + + + + + + + + + - | SR | + + + + + + + + - - | SW | + + + + + + - - - - | SWLP | + + + + + + - - - - | SU | + + + + + - + - - - | SRO | + + + - - + + + - - | SNW | + + + - - - + - - - | SNRW | + + - - - - - - - - | X | - - - - - - - - - - |
说明:横向表示其它事务已经持有的锁,纵向表示事务想加的锁
范围锁的兼容性矩阵:
| Type of active | Request | scoped lock | type | IS(*) IX S X | ---------+------------------+ IS | + + + + | IX | + + - - | S | + - + - | X | + - - - |