MySQL 由于MDL读锁select被阻塞


thread 1、begin;更新表;没有提交,也没有回滚操作thread2、create index 在这个表上这时候客户端超时中断再次连接会话查询此表被阻塞,无法查询

thread3、查询 select * from test;
原因参考如下MDL的读写锁互斥

为什么C等待拿锁之后,D也会阻塞?其实这里并没有解释清楚。因为如果按并发理解的话,
C,D应当是同等级,都有可能拿到锁的。但C读写锁互斥,D读读不互斥,这样的话就跟上图所述相悖了。
就,查了一下。
(鸣谢 一梦如是YFL提供的文章)

首先是MDL(metaData Lock)的概念。元数据锁是server层的锁,表级锁,主要用于隔离DML(Data Manipulation Language,数据操纵语言,如select)和DDL(Data Definition Language,数据定义语言,如改表头新增一列)操作之间的干扰。
每执行一条DML、DDL语句时都会申请MDL锁,
DML操作需要MDL读锁,DDL操作需要MDL写锁(MDL加锁过程是系统自动控制,无法直接干预,读读共享,读写互斥,写写互斥)

申请MDL锁的操作会形成一个队列,
队列中写锁获取优先级高于读锁
。一旦出现写锁等待,不但当前操作会被阻塞,同时还会阻塞后续该表的所有操作。事务一旦申请到MDL锁后,直到事务执行完才会将锁释放。(这里有种特殊情况如果事务中包含DDL操作,mysql会在DDL操作语句执行前,隐式提交commit,以保证该DDL语句操作作为一个单独的事务存在,同时也保证元数据排他锁的释放,例如id 44的语句改为,此时一旦alter语句执行完成会马上提交事务(autocommit=1),后面的select就在本次事务之外,其执行完成后不会持有读锁)

这样就能解释通为什么session C被阻塞后,session D也运行不了的原因了。



简而言之MDL锁开发云主机域名互斥,select也要申请MDL的读锁,这一点真是有点恶心。

相关推荐: MySQL分区学习

https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html 分区是一种表设计模式,自5.1版本开始支持分区,逻辑上是一张表,物理上可能是多个对象。其中MyISAM、…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/05 09:39
下一篇 06/05 09:39

相关推荐