千家信息网

MySQL 由于MDL读锁select被阻塞

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,thread 1、begin;更新表;没有提交,也没有回滚操作thread2、create index 在这个表上这时候客户端超时中断再次连接会话查询此表被阻塞,无法查询thread3、查询 sele
千家信息网最后更新 2025年11月07日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安全错误 数据库的锁怎样保障安全 即时通讯软件开发的哪家好 做软件开发没有接单 关于数据库操作都有什么 电脑管理服务器无法启动 南通技术管理软件开发 最新的网络技术成果有哪些 软件开发最主要且工作量最大 网络安全法律体系专门立法 抹掉iphone连接服务器失败 云服务器java插件下载 深圳市抱一网络技术有限公司 小学网络安全制度 法律法规 昨天steam服务器炸了 微信图片可以从服务器恢复么 怎么将数据库字段设计为自增长 广州中大网络技术学校 美国网络技术发展历程 嵌入式服务器参数 崇明区工业软件开发服务 逃跑吧少年服务器崩溃进不了游戏 一个网站需要什么样的云服务器 方舟电脑版pvp服务器 opensips数据库 湖南学软件开发的专科 服务器内存上跟的S M 我的世界服务器4g运行内存够吗 开展网络安全图片 方舟生存进化老是搜不到服务器 自助借阅机数据库代码 安徽互联网养老软件开发系统
0