iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL的全局锁和表级锁的具体使用
  • 597
分享到

MySQL的全局锁和表级锁的具体使用

MySQL全局锁MySQL表级锁 2022-05-13 09:05:29 597人浏览 薄情痞子
摘要

目录前言全局锁表级锁表锁元数据锁(Metadata Locking,简称:MDL锁)总结参考资料前言 在真实的企业开发环境中使用Mysql,mysql肯定不会只有我一个人使用,而是一个团队显式的使用Mysql,或者

目录
  • 前言
  • 全局
  • 表级锁
    • 表锁
    • 元数据锁(Metadata Locking,简称:MDL锁)
  • 总结
    • 参考资料

      前言

      在真实的企业开发环境中使用Mysqlmysql肯定不会只有我一个人使用,而是一个团队显式的使用Mysql,或者是业务隐式的使用MySQL,那么多个用户或者客户端连接使用的时候,我们应该考虑一个问题:如果保证数据并发访问的一致性呢?这一篇我就来聊聊MySQL的锁,不涉及MySQL的事务隔离级别。

      全局锁

      MySQL的全局锁会关闭所有打开的表,并使全部的表处于只读状态,它们的命令为:

      
      # 全局锁,简称FTWRL
      FLUSH TABLES WITH READ LOCK;
      
      # 解锁命令
      UNLOCK TABLES;
      
      

      对FTWRL进行实验:(以下的所有实验都是在MySQL8.0.22完成的)

      session1 session2
      FLUSH TABLES WITH READ LOCK;
      select * from test limit 1;
      (正常返回结果)
      select * from test limit 1;
      (正常返回结果)
      insert into test(a,b,c) values(6,6,6);
      (报错)
      insert into test(a,b,c) values(8,8,8);# sql1
      (阻塞)
      UNLOCK TABLES;
      insert into test(a,b,c) values(8,8,8);# sql1
      (session1解锁后,sql1立马执行成功)

      从以上实验可以得出:当执行FTWRL后,所有的表变成了只读状态,其他更新的操作将会被阻塞。

      全局锁的主要作用就是做全库逻辑备份,也就是把数据库的每个表都select出来存成文本。

      当备份过程中,整个数据库处于只读状态,风险也是及其的大。如果是在主库备份,将会导致所有的业务表都不能修改数据;如果是在从库备份,这个时候从库不能执行主库传过来的binlog,会导致主从延迟。

      好在InnoDB存储引擎支持事务,mysqldump有一个参数single-transaction,可以在事务中创建一致性快照,然后进行所有表备份。在有这个参数下,备份期间可以进行数据修改,所以正常开发中建议使用InnoDB存储引擎。

      表级锁

      表级锁分为两种,一种是表锁,另一种是元数据锁。

      表锁

      表锁分为表读锁和表写锁,在MySQL的命令是:

      
      # 表读锁
      lock tables test read;
      
      # 表写锁
      lock tables test write;
      
      
      

      接下来通过实验看下表读锁和表写锁有什么区别吧

      表读锁

      session1 session2
      lock tables test read;
      select * from test limit1;
      (正常返回结果)
      select * from test limit 1;
      (正常返回结果)
      insert into test(a,b,c) values(6,6,6);
      (报错)
      insert into test(a,b,c) values(8,8,8); # sql1
      (阻塞)
      unlock tables;
      insert into test(a,b,c) values(8,8,8); # sql1
      (session1解锁后,sql1立马写入成功)

      在session1会话加上了表读锁,这个时候session1和session2都可以正常的读数据,但是session1写数据会报错,session2写数据会被阻塞,等到session1解锁了,session2的写数据才能执行成功。

      从这个实验可以得出:表加上了表读锁之后,本线程和其他线程都可以读数据,本线程写数据会报错,其他线程写数据会阻塞。

      表写锁

      session1 session2
      lock tables test write;
      select * from test limi1;
      (正常返回结果)
      select * from test limit 1; # sql1
      (阻塞)
      unlock tables;
      select * from test limit; # sql1
      (session1解锁后,sql1立马返回结果)
      lock tables test write;
      insert into test(a,b,c) values(6,6,6);
      (插入成功)
      insert into test(a,b,c) values(8,8,8);# sql 2
      (阻塞)
      unlock tables;
      insert into test(a,b,c) values(8,8,8);# sql2
      (session1解锁后,sql2立马执行成功)

      从以上实验可以得出:表加上了表写锁之后,本线程可以进行读写操作,其他线程的读写操作都会被阻塞。

      元数据锁(Metadata Locking,简称:MDL锁)

      在MySQL中,数据库的DDL不属于事务范畴,如果你在session1中select一行数据,这个时候session2给这张表新增了一列xxx,这个时候可能会出现事务特性被破坏、binlog顺序错乱等bug(MySQL官网上有公布出类似的bug,感兴趣可以自行去了解)。

      为了解决以上的问题,从MySQL5.5.3引入了元数据锁,MDL锁不需要显式使用,MySQL会默认加上,它的作用就是保证数据库读写正确性。以下全部用MDL表示元数据锁。

      当你对一张表进行增删查改的时候会默认加上MDL读锁;当你对一张表进行表结构更改的时候会默认加上MDL写锁。

      session1 session2 session3 session4
      begin;
      select * from test lmi1;
      (正常返回结果)
      select * from test limit 1;
      (正常返回结果)
      alter table test add d int;
      (阻塞)
      select * from test limit 1;
      (阻塞)

      一开始session1会话查询test的时候,获取到了MDL读锁,可以正常查询到数据。然后session2会话查询数据也会获取MDL读锁,不冲突,也可以正常查询到数据返回。

      但是到了session3会话的时候,需要获取MDL写锁,这个时候因为session1的MDL读锁没有释放,所以会阻塞。后面session4也需要MDL读锁,但是因为session3被阻塞了,所以session4也会被阻塞。

      假如这是一张线上业务表,这种场景将会使后面的任何操作都失效,表现出来就是这张表变得无法写和读。如果客户端配置了MySQL重试机制的话,会在超时的时候重新建立一个session会话重新请求,然后MySQL就会因为线程不停新增而崩溃。

      从上面的例子可以知道MDL锁是在语句执行的时候默认加上的,但是语句执行完是不会释放的,只有等整个事务提交了才会释放MDL锁。

      所以对于我们开发者来说,在工作中应该尽量避免慢查询、尽量保证事务及时提交、避免大事务等,对于DBA来说,也应该尽量避免在业务高峰期执行DDL操作。

      总结

      • 全局锁会让所有的表变成只读状态,所有更新操作都会被阻塞
      • 表读锁是本线程和其他线程都可以读,本线程写会报错,其他线程写会阻塞
      • 表写锁是本线程可以读写,其他线程读写都会阻塞
      • 引入MDL锁解决事务和DDL同时执行引发的bug

      参考资料

      • 《深入浅出MySQL》第二版:20.3.8 什么时候使用表锁
      • 《MySQL实战45讲》林晓斌

      到此这篇关于MySQL的全局锁和表级锁的具体使用的文章就介绍到这了,更多相关MySQL 全局锁和表级锁内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

      您可能感兴趣的文档:

      --结束END--

      本文标题: MySQL的全局锁和表级锁的具体使用

      本文链接: https://www.lsjlt.com/news/10471.html(转载时请注明来源链接)

      有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

      本篇文章演示代码以及资料文档资料下载

      下载Word文档到电脑,方便收藏和打印~

      下载Word文档
      猜你喜欢
      • MySQL的锁机制之全局锁和表锁的实现
        前言 对mysql锁的总结学习,本文将围绕,加锁的概念,加锁的应用场景和优化,以及不加锁会导致的问题这些方向进行总结学习。mysql的全局锁和表锁是本文的重点 一、全局锁 全局锁的介绍以及使用 全局锁就是对整个数据库实例...
        99+
        2023-01-15
        MySQL全局锁和表锁 MySQL全局锁 MySQL表锁
      • mysql 乐观锁和悲观锁的具体使用
        目录悲观锁介绍(百科):1如果不采用锁,那么操作方法如下:2使用悲观锁来实现:补充:MySQL select…for update的Row Lock与Tabl...
        99+
        2023-01-08
        mysql 乐观锁和悲观锁 mysql 乐观锁 mysql 悲观锁
      • mysql 乐观锁和悲观锁的具体使用
        目录悲观锁介绍(百科):1如果不采用锁,那么操作方法如下:2使用悲观锁来实现:补充:mysql select…for update的Row Lock与Table Lock乐观锁介绍:使用举例:以M...
        99+
        2023-01-09
        mysql 乐观锁和悲观锁 mysql 乐观锁 mysql 悲观锁
      • MySQL数据库中怎么实现全局锁和表级锁
        这篇文章给大家介绍MySQL数据库中怎么实现全局锁和表级锁,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 全局锁全局锁是粒度比较大的锁,基本上也使用不上,就像我们家的大门一样,控制...
        99+
        2024-04-02
      • 史上最详细MySQL全局锁和表锁
        原文: https://www.enmotech.com/web/detail/1/728/1.html   导读:根据加锁的范围,MySQL里面的锁大致可以分成全局锁,...
        99+
        2024-04-02
      • MySQL中怎么实现全局锁和表锁
        今天就跟大家聊聊有关MySQL中怎么实现全局锁和表锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. 全局锁全局锁就是对整个数据库实例加锁。MyS...
        99+
        2024-04-02
      • MySql的行级锁和表级锁是怎样的
        MySql的行级锁和表级锁是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 MySql 行级锁 表级锁如何保...
        99+
        2024-04-02
      • Java 重入锁和读写锁的具体使用
        目录重入锁 1. 实现重进入 2. 公平与非公平获取锁的区别 读写锁 1. 接口示例 2. 读写状态的设计 3. 写锁的获取与释放 4. 读锁的获取与释放 5. 锁降级 重入锁 重...
        99+
        2024-04-02
      • MySQL的表级锁,行级锁,排它锁和共享锁是什么
        这篇文章主要介绍“MySQL的表级锁,行级锁,排它锁和共享锁是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的表级锁,行级锁,排它锁和共享锁是什么”文章能帮助大家解决问题。前言先说下事...
        99+
        2023-07-02
      • SQL中表锁定(LOCK、UNLOCK)的具体使用
        目录MySQL 表锁定LOCK和UNLOCK TABLES语法读锁示例:写锁MySQL 表锁定 锁是与表关联的标志。MySQL允许客户端会话显式获取表锁,以防止其他会话在特定时间段内...
        99+
        2024-04-02
      • mysql数据库中行级锁、表级锁和页级锁的区别是什么
        这篇文章主要介绍了mysql数据库中行级锁、表级锁和页级锁的区别是什么,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。按粒度可以分为:1、行级锁,MySQL中锁定粒度最细的一种锁,表示只针...
        99+
        2024-04-02
      • mysql行锁和表锁怎么使用
        MySQL中的行锁和表锁是用来控制并发访问数据库的机制,可以防止多个用户同时修改同一行或同一表的数据,保证数据的一致性和完整性。1....
        99+
        2023-09-11
        mysql
      • MySQL表级锁使用说明
        目录表级锁1、表级别的S锁,X锁2、意向锁3、自增锁(AUTO-INC锁)4、元数据锁(MDL锁)表级锁 该锁会锁定整张表,它是mysql中最基本的锁策略,并不依赖于存储引擎(不管你是MySQL的什么存储引擎,对于表锁的...
        99+
        2024-04-02
      • MySQL使用表锁和行锁的场景详解
        目录前言全局锁表级锁表锁元数据锁意向锁行级锁总结前言 MySQL Innodb 的锁可以说是执行引擎的并发基础了,有了锁才能保证数据的一致性。众所周知,我们都知道 Innodb 有全...
        99+
        2024-04-02
      • Mysql行级锁和页级锁的优缺点
        本篇内容介绍了“Mysql行级锁和页级锁的优缺点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!    如果...
        99+
        2024-04-02
      • C++11各种锁的具体使用
        目录Mutex(互斥锁)什么是互斥量(锁)?条件变量condition_variable:condition_variable的waitstd::shared_mutex原子操作Mu...
        99+
        2024-04-02
      • MySQL全局锁指的是什么
        这篇文章主要介绍“MySQL全局锁指的是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL全局锁指的是什么”文章能帮助大家解决问题。数据库设计的初衷是处理...
        99+
        2024-04-02
      • MySQL表锁、行锁、排它锁及共享锁的使用详解
        目录前言一、事务隔离机制的选择二、表级锁&行级锁三、排它锁(Exclusive)和共享锁(Shared)1. 测试不同事务之间排它锁和共享锁的兼容性2. 测试行锁加在索引项上...
        99+
        2024-04-02
      • node.js 全局变量的具体使用
        全局对象 所有模块都可以调用 global:表示Node所在的全局环境,类似于浏览器中的window对象。 process:指向Node内置的process模块,允...
        99+
        2024-04-02
      • mysql表级锁的模式有几种
        本篇内容介绍了“mysql表级锁的模式有几种”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、表共享读锁,添加共享读锁的表不会阻塞其他ses...
        99+
        2023-06-20
      软考高级职称资格查询
      编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
      • 官方手机版

      • 微信公众号

      • 商务合作