首页 > 数据库 >mysql的元数据锁:metadata_locks

mysql的元数据锁:metadata_locks

时间:2023-02-02 20:57:41浏览次数:39  
标签:事务 MDL 会话 DDL locks mysql 操作 数据 metadata

#############################

 

MDL全称为metadata lock,即元数据锁。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务(显式或隐式)的时候,不可以对元数据进行写入操作。因此从MySQL5.5版本开始引入了MDL锁,来保护表的元数据信息,用于解决或者保证DDL操作与DML操作之间的一致性。

 

对于引入MDL,其主要解决了2个问题,一个是事务隔离问题,比如在可重复隔离级别下,会话A在2次查询期间,会话B对表结构做了修改,两次查询结果就会不一致,无法满足可重复读的要求

另外一个是数据复制的问题,比如会话A执行了多条更新语句期间,另外一个会话B做了表结构变更并且先提交,就会导致slave在重做时,先重做alter,再重做update时就会出现复制错误的现象。

 

元数据锁是server层的锁,表级锁,每执行一条DML、DDL语句时都会申请MDL锁,DML操作需要MDL读锁,DDL操作需要MDL写锁(MDL加锁过程是系统自动控制,无法直接干预,读读共享,读写互斥,写写互斥),

申请MDL锁的操作会形成一个队列,队列中写锁获取优先级高于读锁。一旦出现写锁等待,不但当前操作会被阻塞,同时还会阻塞后续该表的所有操作。事务一旦申请到MDL锁后,直到事务执行完才会将锁释放。

(这里有种特殊情况如果事务中包含DDL操作,mysql会在DDL操作语句执行前,隐式提交commit,以保证该DDL语句操作作为一个单独的事务存在,同时也保证元数据排他锁的释放)。

 

注: 支持事务的InnoDB引擎表和不支持事务的MyISAM引擎表,都会出现Metadata Lock Wait等待现象。一旦出现Metadata Lock Wait等待现象,后续所有对该表的访问都会阻塞在该等待上,导致连接堆积,业务受影响。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

###################################

标签:事务,MDL,会话,DDL,locks,mysql,操作,数据,metadata
From: https://www.cnblogs.com/igoodful/p/17087354.html

相关文章

  • MySQL基础
    vsMySQL数据库1.数据库相关概念数据库:存储数据的仓库,数据是有组织的进行存储,英文:DataBase,进程DB存储和管理数据的仓库其本质是一个文件系统,还是以文件的方式将......
  • mysql悲观锁 (使用行级锁,走索引字段,必须是具体值)
        不需要加锁,一行更新语句即可,符合原子性   对于没有加注解的,mysql也会对增删改的自动加上事务,autocommit=0的时候才没有事务,其他都有事务开启......
  • mysql创建视图注意事项
    转自:https://www.cnblogs.com/cctvyuzhou/p/8985582.html可以使用CREATEVIEW语句来创建视图语法格式如下:CREATEVIEW<视图名>AS<SELECT语句>语法说明如下。1......
  • python mysql直接导出excel文件
    importpymysqlimportxlwt#数据库连接对象conn=pymysql.connect(host='124.71.72.144',port=3306,user='root',password="gClUjjCh2tozZY23o",db="pay",chars......
  • 【推荐】MySQL数据库设计SQL规范
    1命名规范1、【强制】库名、表名、字段名必须使用小写字母并采用下划线分割,禁止拼音英文混用;(禁用-,-相当于运算符)2、【建议】库名、表名、字段名在满足业务需求的条件下使用......
  • 安装MySQL
    1.登录https://dev.mysql.com/downloads/2.下载MySQLInstallerforWindows3.安装MySQLInstallerforWindows4.启动MySQL服务5.验证:打开MySQL8.0CommandLineC......
  • MySQL Consistent Nonlocking Reads
    一致性读一致性读意味着InnoDB使用多版本技术在某个时间点使用该时间点的快照进行一致性读;默认可重复读隔离级别,当前事务只能看到在当下时间点之前提交事务产生的变化,时间......
  • 【推荐】MySQL数据库设计SQL规范
    1命名规范1、【强制】库名、表名、字段名必须使用小写字母并采用下划线分割,禁止拼音英文混用;(禁用-,-相当于运算符)2、【建议】库名、表名、字段名在满足业务需求的条件下......
  • [mysql]定制封装MySQL的docker镜像
    前言基于MySQL的原版镜像做一些个性化配置修改,封装/etc/my.cnf文件到镜像中,并且支持通过环境变量修改innodb_buffer_pool_size、server_id以及自动配置innodb_read_io_thr......
  • 【达梦数据库】MySQL 的ON DUPLICATE KEY UPDATE语句在达梦数据库中使用的方式
    背景想要做数据同步,但不知道待同步的数据是新增或更新于是想,如果数据库可以识别InsertOrUpdate就好了使用的是达梦数据库but:1、达梦是没有ONDUPLICATEKEYUPDAT......