mysql lock database_MySQL 5.6 drop database时,table metadata lock等待

一个线下库环境,开发人员不提交DML和查询事务,导致drop database时,遭遇表的metadata lock(MDL)等待,而不是SCHEMA上。

即会看到 “Waiting for table metadata lock”,而不是”Waiting for schema metadata lock”。这是为什么呢?

经过源码分析,原因如下。

我们知道:

select 语句在操作时,需要对表对象持有MDL_SHARED_READ锁。

而DML语句在操作时,需要对表对象持有MDL_SHARED_WRITE锁。但都不需要SCHEMA级别metadata lock锁。

另外drop database 时,需要依次获取以下MDL锁:

1) MDL_INTENSION_EXCLUSIVE(GLOBAL),STATEMENT 级别

2) MDL_EXCLUSIVE(SCHEMA),TRANSACTION级别

3) MDL_EXCLUSIVE (TABLE),TRANSACTION级别。在此database下的每个对象,需要MDL_EXCLUSIVE锁。

那么原因就非常明显了:

这是因为查询或者DML一张表时,只会获取这个表的MDL_SHARED_READ或者MDL_SHARED_WRITE锁;

而drop database 时,会按以上流程获取相关锁,因此只在第三步有冲突,前面两步不会有冲突。

示例如下:

1. 起查询事务

d77af773b70d0c3e6e35dfeb1f35622c.png

2. 删除数据库,此时当前会话hang住。

33812bbc2d01afd57d6b5a0e0d4a248a.png

3. Show processlist结果,看到有”Waiting for table metadata lock”。

478b5899c96d098c012ac84f1abd1fef.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值