MDL锁
mdl锁的主要作用是用来维护表元数据的一致性。在表上有活动事务的时候,不可以对表元数据进行修改操作。

如果没有MDL锁的保护,那么session2可以直接执行,并导致session1出错。
MDL锁是server层级的锁,每执行一条DDL DML语句事都会申请MDL锁,MDL加锁过程事系统自动控制,无法直接干预,申请MDL锁的操作会形成1个队列,队列中写锁的优先级高于读锁的优先级。一旦出现写锁等待,不但当前操作会阻塞,同时还会阻塞针对该表的其他后续操作。

MDL锁类型

锁的兼容性
由于所有的mdl对象存放在全局对象中,并发量大的时候容易出现热点,出现并发瓶颈,mysql5.6中对其进行了优化:
metadata_locks_cache_size: MDL锁的缓存大小,设定MDL缓存的上限,用来避免创建或销毁同步对象
metadata_locks_hash_instances:通过分片来提高并发度,与InnoDB AHI类似
MySQL5.7对MDL锁的优化:
1. MySQL56以库名+表名的方式作为key进行分区,如果查询或者DML都集中在同一张表上,就会hash到相同的分区,依然会出现热点
针对这点,MySQL57引入 LOCK FREE的 HASH来存储 mdl lock。
2. 优化DML操作对于MDL锁的开销。
大致思路是将MDL锁拆分为两类,一类是DML操作的mdl,之间相互兼容,一类是DDL操作的mdl,与其他锁互斥。
为了实现针对DML类型的快速加锁,改用使用计数器的方式来实现,称为 FAST-PATH,如果FAST-PATH加锁失败,则走 SLOW-PATH来进行加锁。
每个MDL锁对象都维持了一个 long long类型的状态值来标识当前的加锁 状态,变量名为 MDL_lock::m_fast_path_state。
Session 1:BEGIN;
Session 1: SELECT * FROM sbtest1 WHERE id =1; //m_fast_path_state = 1048576, MDL ticket 不加MDL_lock::m_granted队列
Session 2: BEGIN;
Session 2: SELECT * FROM sbtest1 WHERE id =2; //m_fast_path_state=1048576+1048576=2097152,同上,走FAST PATH
Session 3: ALTER TABLE sbtest1 ENGINE = INNODB; //DDL请求加的MDL_SHARED_UPGRADABLE类型锁被视为unobtrusive lock,可以认为这个是比上述SQL的MDL锁级别更高的锁,并且不相容,因此被强制走slow path。而slow path是需要加MDL_lock::m_rwlock的写锁。
m_fast_path_state = m_fast_path_state | MDL_lock::HAS_SLOW_PATH | MDL_lock::HAS_OBTRUSIVE
Session 4: SELECT * FROM sbtest1 WHERE id =3; // 检查m_fast_path_state &HAS_OBTRUSIVE,如果DDL还没跑完,就会走slow path。
3. 彻底移除THR LOCK,完全使用MDL锁来实现。
参考:
https://blog.csdn.net/weixin_34204722/article/details/90618941
http://mysql.taobao.org/monthly/2014/11/05/
https://www.cnblogs.com/zengkefu/p/5690385.html
MDL锁的更多相关文章
- MySQL锁系列3 MDL锁
http://www.cnblogs.com/xpchild/p/3790139.html MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...
- mysql 原理 ~ DDL之mdl锁
一 简介: MDL锁 二 具体 1 MDL锁 1 增删查改 申请MDL读锁 2 ddl语句 1. 拿MDL写锁 2. 降级成MDL读锁 3. 真正做DDL ...
- 有了MDL锁视图,业务死锁从此一目了然
摘要:MDL锁视图让一线运维人员清晰地查看数据库各session持有和等待的元数据锁信息,从而找出数据库MDL锁等待的根因,准确地进行下一步决策. 当多用户共同存取数据时,数据库中就会产生多个事务同时 ...
- mdl 锁 SYSTEMTAP跟踪
systemtap : 各种资源的使用限制由所生成的C代码中的宏来设置.这些值可在编译时由-D选项来重写.下面描述了部分挑选出来的宏: MAXNESTING 递归函数的最大调用层数,默认值是10. M ...
- 深入理解MYSQL的MDL元数据锁
1 前言 2 MDL锁与实现 3 MDL锁的性能与并发改进 4 MDL锁的诊断 前言 好久没更新,主要是因为Inside君最近沉迷于一部动画片——<新葫芦娃兄弟>.终于抽得闲,完成了本篇关 ...
- 深入理解MDL元数据锁
前言: 当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processli ...
- (转载)深入理解MDL元数据锁
作者:MySQL技术本文为作者原创,转载请注明出处:https://www.cnblogs.com/kunjian/p/11993708.html 前言: 当你在MySQL中执行一条SQL时,语句并没 ...
- 一步步搞懂MySQL元数据锁(MDL)
某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令'delete from bigtable',但好长时间也没删完,经过咨询后,获知dr ...
- MySQL锁机制总结(二)
前言: Mysql是一个支持插件式存储引擎的数据库系统,本文讨论的锁机制也主要包含两部分SERVER层的锁和存储引擎的锁,存储引擎是指innodb,其它存储引暂不讨论. 1. 数据库中锁相关的基本概念 ...
随机推荐
- 通过blacklist来禁用驱动
blacklist黑名单 我们在linux中安装驱动,有时会遇到受限或冲突,通常解决方式都是要修改blacklist.conf.对内核模块来说,黑名单是指禁止某个模块装入的机制 在 /etc/modp ...
- ElasticSearch7.3 学习之定制动态映射(dynamic mapping)
1.dynamic mapping ElasticSearch中有一个非常重要的特性--动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 当ES在文档中 ...
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数。。。使用
一,问题描述 MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引 ...
- kafka producer如何优化打入速度?
增加线程 提高 batch.size 增加更多 producer 实例 增加 partition 数 设置 acks=-1 时,如果延迟增大:可以增大 num.replica.fetchers(fol ...
- memcached 最大的优势是什么?
Memcached 最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的 系统中.由于客户端自己做了一次哈希,那么我们很容易增加大量 memcached 到集群中.memcached 之间没有 ...
- 指出在 spring aop 中 concern 和 cross-cutting concern 的不同之处?
concern 是我们想要在应用程序的特定模块中定义的行为.它可以定义为我们想 要实现的功能. cross-cutting concern 是一个适用于整个应用的行为,这会影响整个应用程序. 例如,日 ...
- C++中sort()函数使用介绍
sort()简介 为什么选择使用sort() 在刷题的时候我们经常会碰到排序的问题,如果我们不使用一些排序的方法那我们只能手撕排序,这样就会浪费一些时间.而且我们还需要根据需要去选择相关的排序方法: ...
- 5_终值定理和稳态误差_Final Value Theorem & Steady State Error
- PN结
摘自:https://blog.csdn.net/CPJ_phone/article/details/40979027 ...
- 罗振宇2022"时间的朋友"跨年演讲
罗振宇2022"时间的朋友"跨年演讲 行就行,不行我再想想办法. 原来,还能这么干! 堆资源不是解决问题的唯一道路,还是那句话:"处于困境中的人往往只关注自己的问题.而解 ...