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锁的更多相关文章

  1. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  2. mysql 原理 ~ DDL之mdl锁

    一 简介: MDL锁 二 具体 1 MDL锁   1 增删查改 申请MDL读锁   2 ddl语句       1. 拿MDL写锁      2. 降级成MDL读锁      3. 真正做DDL    ...

  3. 有了MDL锁视图,业务死锁从此一目了然

    摘要:MDL锁视图让一线运维人员清晰地查看数据库各session持有和等待的元数据锁信息,从而找出数据库MDL锁等待的根因,准确地进行下一步决策. 当多用户共同存取数据时,数据库中就会产生多个事务同时 ...

  4. mdl 锁 SYSTEMTAP跟踪

    systemtap : 各种资源的使用限制由所生成的C代码中的宏来设置.这些值可在编译时由-D选项来重写.下面描述了部分挑选出来的宏: MAXNESTING 递归函数的最大调用层数,默认值是10. M ...

  5. 深入理解MYSQL的MDL元数据锁

    1 前言 2 MDL锁与实现 3 MDL锁的性能与并发改进 4 MDL锁的诊断 前言 好久没更新,主要是因为Inside君最近沉迷于一部动画片——<新葫芦娃兄弟>.终于抽得闲,完成了本篇关 ...

  6. 深入理解MDL元数据锁

    前言:  当你在MySQL中执行一条SQL时,语句并没有在你预期的时间内执行完成,这时候我们通常会登陆到MySQL数据库上查看是不是出了什么问题,通常会使用的一个命令就是 show processli ...

  7. (转载)深入理解MDL元数据锁

    作者:MySQL技术本文为作者原创,转载请注明出处:https://www.cnblogs.com/kunjian/p/11993708.html 前言: 当你在MySQL中执行一条SQL时,语句并没 ...

  8. 一步步搞懂MySQL元数据锁(MDL)

    某日,路上收到用户咨询,为了清除空间,想删除某200多G大表数据,且已经确认此表不再有业务访问,于是执行了一条命令'delete from bigtable',但好长时间也没删完,经过咨询后,获知dr ...

  9. MySQL锁机制总结(二)

    前言: Mysql是一个支持插件式存储引擎的数据库系统,本文讨论的锁机制也主要包含两部分SERVER层的锁和存储引擎的锁,存储引擎是指innodb,其它存储引暂不讨论. 1. 数据库中锁相关的基本概念 ...

随机推荐

  1. springboot 踩坑之路之 Configuration Annotation Proessor not found in classpath

    1.出现spring boot Configuration Annotation Proessor not found in classpath的提示是在用了@ConfigurationPropert ...

  2. Linux移植实际操作一

    @ 目录 *前言 目前看了很多关于"Linux移植"的的各种教程.书籍,看完发现不过是对已有板子.已有驱动进行启用.禁用.参数修改.只能叫做"Linux配置". ...

  3. 5月28日 python学习总结 CSS学习(一)

    1. CSS是什么 层叠样式表 --> 给HTML添加样式的 2. CSS的语法 选择器 { 属性1:值1; 属性2:值2; } 3. CSS引入方式 1. 直接写在HTMl标签里面 <p ...

  4. CF1225E Rock Is Push (计数)

    观察性质计数题orz小贺 考场上跟榜才切 我们只能往下和往右走,那么只有连续的往下和往右可能会造成不合法的情况!如果当前这一步是向右,那么只有它前面连续的一段向右可能影响到它. 考虑把连续的向右/下一 ...

  5. grafana初级入门

    grafana初级入门 预备知识 Metrics.Tracing和Logging的区别 监控.链路追踪及日志作为实时监测系统运行状况,这三个领域都有对应的工具和解决方案. Metrics 监控指标的定 ...

  6. HashMap:为什么容量总是为2的n次幂

    HashMap:为什么容量总是为2的n次幂1).HashMap是根据key的hash值决定key放到哪个桶中,通过tab[i = (n - 1) & hash]公式计算得出 这里的n是Hash ...

  7. Idea集成CSSO插件压缩css文件

    首先需要本地已安装node环境,并且csso-cli已通过npm安装到本地目录,只要能找到就行. 1. 打开Settings配置,确认图中的 File Watchers 插件是否已存在,如果不存在,去 ...

  8. 什么是openssl?

    在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份.这个包广泛被应用在互联网的网页服务器上.

  9. iHTML 的 form 提交之前如何验证数值文本框的内容全部为数字

    <input type="text" id="d1" onblur=" chkNumber (this)"/> <scri ...

  10. 简述 Mybatis 的插件运行原理,以及如何编写一个插件?

    Mybatis 仅可以编写针对 ParameterHandler.ResultSetHandler. StatementHandler.Executor 这 4 种接口的插件,Mybatis 使用 J ...