千家信息网

MySQL 由于MDL读锁select被阻塞

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,thread 1、begin;更新表;没有提交,也没有回滚操作thread2、create index 在这个表上这时候客户端超时中断再次连接会话查询此表被阻塞,无法查询thread3、查询 sele
千家信息网最后更新 2026年11月01日MySQL 由于MDL读锁select被阻塞

thread 1、begin;

更新表;没有提交,也没有回滚操作

thread2、create index 在这个表上

这时候客户端超时中断

再次连接会话查询此表被阻塞,无法查询

thread3、查询 select * from test;

root@localhost : yaochong 17:08:27> select id,user,host,db,command,time,state,info from information_schema.processlist where user <>'system user' and info not like '%system user%';+-------+------+-----------+----------+---------+------+---------------------------------+---------------------------------------------------------------+| id    | user | host      | db       | command | time | state                           | info                                                          |+-------+------+-----------+----------+---------+------+---------------------------------+---------------------------------------------------------------+| 10161 | root | localhost | yaochong | Query   | 3386 | Waiting for table metadata lock | select * from test                                            || 10092 | root | localhost | yaochong | Query   | 6375 | Waiting for table metadata lock | alter table test add key(name) , ALGORITHM=INPLACE, LOCK=NONE |+-------+------+-----------+----------+---------+------+---------------------------------+---------------------------------------------------------------+2 rows in set (0.00 sec)

原因参考如下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的读锁,这一点真是有点恶心。

事务 阻塞 语句 数据 查询 原因 同时 语言 队列 保证 解释 有种 清楚 特殊 恶心 这样的话 之间 优先级 再次 客户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会主任 科技赋能下的互联网金融 疫情对互联网科技公司影响 青岛互联网科技公司 期待互联网科技 紫鲸互联网科技 壕鑫互联网络科技 睿民互联网科技 深圳期待互联网科技 深圳国际航运科技和互联网 恒银科技与互联网金融 荆州市昕露互联网络科技有限公司 互联网科技革命什么开始 互联网科技大奖都有哪些公司 工业互联网展湾科技股份有限公司 无锡工业互联网科技有限公司 互联网科技包装股 银川新华互联网科技学校原画 美国五大互联网科技公司市值多少 马化腾互联网科技教学 上海卓越科技互联网 互联网科技有限公司图片 科技互联网的估值 移动互联网科技股 华服互联网科技官网 互联网5g黑科技有哪些 想开互联网科技公司怎么样 互联网科技公司营业执照怎么办理 群盈汇互联网科技有限公司 中国互联网有什么科技
0