当前位置: 首页 > news >正文

MySQL-进阶篇-锁

温馨提示:建议在PC端浏览~

    • 概述

      • 介绍

        • 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。
      • 分类

        • MySQL中的锁,按照锁的粒度分,分为以下三类:
          • 全局锁:锁定数据库中的所有表。

          • 表级锁:每次操作锁住整张表。

          • 行级锁:每次操作锁住对应的行数据。

    • 全局锁

      • 介绍

        • 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

        • 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

      • 演示

          • 说明:绿色代表可以执行的操作,红色代表被阻塞的操作。
      • 特点

        • 数据库中加全局锁,是一个比较重的操作,存在以下问题:

          • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
          • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。(运维篇会详细讲解,这里只做了解即可)
        • 在InnoDB引擎中,我们可以在备份时加上参数–single-transaction参数来完成不加锁的一致性数据备份。

          • mysqldump --single-transaction -uroot -p123456 itcast > itcast.sql
    • 表级锁

      • 介绍:表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。

      • 对于表级锁,主要分为以下三类:

        • 表锁

        • 元数据锁(meta data lock,MDL)

        • 意向锁

      • 表锁

        • 对于表锁,分为两类:

          • 表共享读锁(read lock)

          • 表独占写锁(write lock)

          • 小结:读锁不会阻塞其他客户端的读,但是会阻塞写。写锁既会阻塞其他客户端的读,又会阻塞其他客户端的写。

        • 语法

          • 加锁:lock tables 表名… read/write。
          • 释放锁:unlock tables / 客户端断开连接。
      • 元数据锁(meta data lock,MDL)

        • MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL冲突,保证读写的正确性。(元数据可以简单理解为表结构;元数据锁可以确保当前事务修改表结构时,不存在其他事务对同一张表进行并发操作)

        • 在MySQL5.5中引入了MDL,当对一张表进行增删改查的时候,加MDL读锁(共享);当对表结构进行变更操作的时候,加MDL写锁(排他)。

        • 查看元数据锁

          • selectobject_type,object_schema,object_name,lock_type,lock_durationfromperformance_schema.metadata_locks;
      • 意向锁

        • 为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。(避免表锁在加锁时逐行的去检查这张表的行锁情况)

        • 分类

          • 意向共享锁(IS):由语句select … lock in share mode添加。
          • 意向排他锁(IX):由insert、update、delete、select … for update添加。
        • 意向锁与表锁的兼容情况

          • 意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排它锁(write)互斥。
          • 意向排他锁(IX):与表锁共享锁(read)及排它锁(write)都互斥。意向锁之间不会互斥。
        • 可以通过以下SQL,查看意向锁及行锁的加锁情况:

          • selectobject_schema,object_name,index_name,lock_type,lock_mode,lock_datafromperformance_schema.data_locks;
    • 行级锁

      • 行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

      • InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

        • 行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
        • 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
        • 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
      • 行锁

        • InnoDB实现了以下两种类型的行锁:

          • 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
          • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
        • 兼容情况

        • 不同SQL语句所加行锁的类型情况

        • 默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。

          • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
          • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。
        • 可以通过以下SQL,查看意向锁及行锁的加锁情况:

          • selectobject_schema,object_name,index_name,lock_type,lock_mode,lock_datafromperformance_schema.data_locks;
      • 间隙锁 / 临键锁

        • 默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。
          • 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
          • 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
          • 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。
        • 注意:间隙锁唯一目的是防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。
http://www.cnnetsun.cn/news/2479205.html

相关文章:

  • 15分钟搞定黑苹果:OpCore-Simplify如何让OpenCore配置从噩梦变简单?
  • 终极指南:3步掌握SpanDSP电信信号处理库的核心技术与实战应用 [特殊字符]
  • Virtual ZPL Printer:基于以太网的虚拟斑马打印机解决方案
  • 嵌入式数据存储终极指南:5分钟快速上手FlashDB超轻量级数据库
  • Windows上的安卓应用安装专家:APK安装器完全指南
  • 3分钟解决Cursor试用限制:设备标识重置完整指南
  • GGCNN实战指南:掌握机器人抓取生成的终极深度学习方案
  • Steam卡片自动收集神器:Idle Master终极使用教程
  • 异构多处理器评估板实现:从启动到核间通信的工程实践
  • DS18B20时序不稳?一个中值滤波函数帮你搞定所有异常数据(附C代码)
  • modern-screenshot完整指南:从基础使用到高级优化
  • 9大主流网盘直链解析工具:LinkSwift下载效率革命
  • React PowerPlug生态扩展:如何自定义无渲染组件和组合工具
  • 手把手教你为展锐平台新摄像头(如OV08A10)添加驱动:Sensor配置与AF驱动集成详解
  • 告别按键抖动!用STM32CubeMX配置EXTI外部中断实现精准按键检测(附完整代码)
  • 深度解密:浏览器资源嗅探的5大实战应用场景与进阶技巧
  • 从遥控器到单片机:深入浅出解析SBUS协议的数据打包与解包算法
  • Perplexity谚语查询失效的4种致命信号,资深AI工程师紧急预警:第3种正在 silently 损耗你的研究可信度
  • 学术研究者的文献翻译革命:Zotero PDF2zh如何重塑双语文献处理工作流
  • RL78/G13 IO模拟驱动LCD12864:4位并行模式实现与移植指南
  • Internetarchive元数据管理实战:掌握metadata操作的最佳实践
  • CANN/cannbot-skills SuperKernel适配技能
  • CANN Scatter算子评测
  • CANN/asnumpy随机抽样API
  • wlnmp一键安装包260520更新:多软件版本升级,支持多系统架构快速部署
  • 智能救场答辩,PPT躺平出圈
  • BBDown实用指南:高效下载B站视频的完整解决方案
  • OpCore-Simplify:3步完成黑苹果配置的终极自动化工具
  • 《大营销平台系统设计实现》 - 营销服务 第3节:策略概率装配处理
  • 通过 curl 命令快速测试 Taotoken 大模型接口连通性