MySQL 进阶(四)【锁】

news2024/11/13 18:32:36

1、锁

1.1、锁的概述

        锁就不需要多介绍了,多个用户访问共享数据资源,如何保证数据并发访问的一致性、有效性是数据库最重要的问题。同时,锁冲突也是影响一个数据库并发性能最重要的因素。

MySQL 中锁的划分有三类:

  • 全局锁:锁定数据库中所有表
  • 表级锁:每次操作锁定整张表
  • 行级锁:每次操作锁住对应的行

1.2、全局锁

        全局锁会锁定整个数据库实例,使得整个数据库处于只读状态,后续的 DML、DDL 语句都会被阻塞住。

        全局锁的使用场景主要就是做全库的逻辑备份,对所有表进行锁定,以保证数据的一致性和完整性。

1.2.1、语法

全局锁语法

flush tables with read lock;

备份数据

注意:这是 mysql 的一个工具,不是在 sql 窗口执行; 

mysqldump -uroot -p database_name > file.sql;

解锁

unlock tables;

 1.2.2、测试

给 saprk 数据库加全局锁: 

测试从其他客户端插入数据(发现被阻塞): 

备份数据库:

 备份成功后,被阻塞的插入语句执行成功:

1.2.3、特点

全局锁是一个比较重的操作,存在以下问题:

  1. 如果在主库上备份,那么备份期间都不能执行更新,业务基本停滞
  2. 如果在从库上备份,那么备份期间从库不能从主库同步 binlog,会导致主从延迟

在 InnoDB 引擎中,我们在备份时加上 --single-transaction 参数来完成不加锁的一致性数据备份

mysqldump --single-transcation -uroot -p database_name > file.sql;

1.3、表级锁

表级锁每次锁住整张表。发生锁冲突的概率最大,并发度最低。主要分为三类:

  • 表锁
  • 元数据锁
  • 意向锁

1.3.1、表锁

表锁主要分为:

  • 表共享锁(读锁)
  • 表独占锁(写锁)

        这有点像我们 zookeeper 中分布式锁的概念,在 zookeeper 的分布式锁中也分为共享锁和排它锁,其中排它锁指的就是独占锁(写),共享锁就是读锁。

语法
  • 加锁:lock tables 表名 read/lock
  • 释放锁:unlock tables 或者 关闭客户端
读锁测试

给表 student 加上表锁: 

可以看到,当 student 表被加上表锁时,其它客户端只能对该表只读不写

写锁测试

可以看到,当 student 被加上写锁时,其它客户端既不能读更不能写;为的是保证数据库的一致性;

1.3.2、元数据锁(meta data lock,MDL)

        MDL 加锁过程是自动的,不需要显示声明,在访问一张表的时候会自动加上。MDL 锁主要是维护表数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作(也就是 不能修改表结构)。

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

简单来说就是,在操作表数据的时候不能修改表结构;

1.3.3、意向锁

        意向锁是为了解决行锁和表锁的冲突问题。在 DML 执行时,会给要操作的数据行加一个行锁,如果此时有线程需要对这张表加一个表锁就会发生冲突。所以 InnoDB 就引入了意向锁,使得表锁不用一行一行去检查当前行是否已经加锁;

语法

  • 意向共享锁(IS):由 select ... lock in share mode 添加(和表锁的读锁兼容,写锁互斥)
  • 意向排他锁(IX):由 insert、update、delete、select ... for update 添加(和表锁的读锁和写锁都互斥)

注意意向锁之间是不会互斥的

加锁过程

  • begin
  • update ... (加行锁的同时给全表加一个意向锁)
  • commit(释放锁)

这样,当需要对全表加表锁的时候,就不需要逐行去检查是否有行锁了;

1.4、行级锁

        行级锁每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低,并发度最高。行级锁是 InnoDB 和 MyISAM 一大区别(MyISAM 支持的最细粒度是表级锁)。

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

  • 行锁(record lock):锁定单行记录,防止其它事务进行 update 和 delete;

  • 间隙锁(gap lock):锁定索引记录间隙(不含记录),确保索引记录间隙不变,防止其它事务在这个间隙进行 insert,产生幻读;

  • 临键锁(next-key lock):行锁和间隙锁的组合,同时锁住数据和数据前面的间隙;

1.4.1、行锁

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

  • 共享锁(S):允许一个事务去读一行,阻止其它事务获得相同数据的排它锁。(也就是说,共享锁和共享锁之间是兼容的,共享锁和排它锁之间是互斥的)
  • 排它锁(X):允许获取排它锁的事务更新数据,阻止其它事务获得相同的数据的共享锁和排它锁(也就是说,排它锁和共享锁和排它锁之间都是互斥的

        默认情况下,InnoDB 在可重复读(repeatable read)事务隔离级别运行,InnoDB 使用 next-key 锁进行搜索和索引,以防止幻读。

  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁
  • InnoDB 的行锁是针对于索引加的锁,不通过索引条件检索数据,那么 InnoDB 将对表中所有记录加锁,此时就会升级为表锁

上一节讲SQL优化时,关于 update 语句的优化就是:

        当我们在使用 update 语句的时候,一定要注意尽量使用索引字段做为更新条件去更新,否则就会出现行锁升级为表锁,并发性能就会降低;因为 InnoDB 的行锁是针对索引加的锁,而不是针对记录加的锁! 

1.4.2、间隙锁/临键锁

注意:这一块知识点不需要记,了解即可。

默认情况下,InnoDB 在可重复读(repeatable read)事务隔离级别运行,InnoDB 使用 next-key 锁进行搜索和索引,以防止幻读。

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
  • 索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询要求时,next-key lock 退化为间隙锁
  • 索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止

注意:间隙锁唯一目的是防止其它事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

-- 假设 age 列存在普通索引 idx_stu_age 
select * from student where age = 12 lock in share mode;

        上面这条查询语句会加一个共享锁,同时,因为是 age 是普通索引,所以除了给这一行记录加一个共享锁之外,还会在 age = 3 和下一位 age != 3 的记录中间加一个间隙锁;给 age=3 之前的记录都加一个临键锁。

select * from student where >= 19 lock in share mode;

        上面这条范围查询语句除了会给 age = 19 行这条记录锁住之外(共享锁),还会给 age > 19 的第一个记录加一个临键锁,以及给正无穷到 age >19 的第一个记录之间的记录加一个临键锁。

总之,主要记住一点:间隙锁锁的是数据之间的间隙,不锁记录;而临键锁既会锁住该记录,也会锁住该记录之前的所有间隙;

总结

  • 概述

    • 锁是并发访问时,解决数据访问一致性、有效性问题的一种机制

  •  全局锁

    • 加锁后,整个数据库只读不写,影响业务

    • 性能差,主要用于数据逻辑备份

  • 表级锁

    • 表锁:读锁,写锁,把整张表锁住

    • 元数据锁:防止 DML 语句和 DDL 语句冲突

    • 意向锁:规避行锁和表锁在加锁时的冲突问题,避免表锁在加锁时逐行去检查每行的加锁情况

  • 行级锁

    • 行锁:只有共享锁之间可以兼容,共享锁和排它锁之间,排它锁和排它锁之间都冲突

    • 间隙锁:解决多个事务并发操作时出现幻读的情况

    • 临键锁:行锁和间隙锁的组合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1930476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

敏捷营销在AI智能名片微信小程序中的应用探索

摘要:在数字化转型的浪潮中,企业面临着前所未有的挑战与机遇。AI智能名片微信小程序作为一种创新的营销工具,以其便捷性、智能化和高效性,正逐步成为企业连接客户、推广品牌的新宠。然而,如何在快速变化的市场环境中&a…

Automation Anywhere推出新一代AI+自动化企业系统,助力企业实现10倍商业增长

RPA厂商纷纷进军AI Agent ( AI 代理)领域,陆续推出创新产品。最近,Automation Anywhere宣布推出其新的AI 自动化企业系统,该系统结合AI和自动化技术,以实现指数级的业务成果。 在Imagine 2024大会上首次亮相的这款新产品&#xf…

机器学习中的梯度下降

本文只是简单解释一下梯度下降,其中涉及到的公式并没有展示说明。 1.什么是梯度? 梯度也可以理解为导数。 在一维空间中:梯度就是导数,或者说对于一个线性函数,也就是线的斜率。 2.什么是梯度下降? 梯度是…

字典树实现

一、字典树 字典树(Trie树)是一种多叉树结构,每条边代表一个字符,从根节点到其它节点的路径构成一个单词。其具有较好的查询性能,可以用于有效地存储大量字符串,并支持高效的查找、插入和删除操作。 二、…

浏览器缓存:强缓存与协商缓存实现原理有哪些?

1、强缓存:设置缓存时间的,那么在这个时间内浏览器向服务器发送请求更新数据,但是服务器会让其从缓存中获取数据。 可参考:彻底弄懂强缓存与协商缓存 - 简书 2、协商缓存每次都会向浏览器询问,那么是怎么询问的呢&…

java 项目使用 acitiviti 流程引擎中的人员设置

学习目标: 目标 [ ]了解 java 项目使用 acitiviti 流程引擎中的人员设置 知识小记: - [x] 1、人员选择说明 - [x] 2、分配任务候选人 任务的候选人是指有权限对该任务进行操作的潜在用户群体,这个用户群体有权限处理(处理、完成)该任务…

第九课:服务器发布(静态nat配置)

一个要用到静态NAT的场景,当内网有一台服务器server1,假如一个用户在外网,从外网访问内网怎么访问呢,无法访问,这是因为外网没办法直接访问内网,这时候需要给服务器做一个静态NAT。 静态NAT指的是给服务器…

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由泄漏)

3、路由泄漏 什么是路由泄漏? IS-IS路由协议允许路由信息的两级层次结构。可以有多个1级区域通过连续的2级主干互连。路由器可以属于1级、2级或两者。1级链路状态数据库仅包含有关该区域的信息。第2级链路状态数据库包含有关该级别以及每个第1级区域的信息。L1/L2…

Matlab|基于蒙特卡洛法的电动汽车充电负荷计算

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序方法复现《V2G 模式下含分布式能源的配电网优化运行研究》第二章电动汽车无序充电模型,按照文章《V2G 模式下基于复杂网络的电动汽车有序充电策略》分析思路研究了不同数量电动汽车接入情况…

初识Docker及管理Docker

Docker部署 初识DockerDocker是什么Docker的核心概念镜像容器仓库 容器优点容器在内核中支持2种重要技术:Docker容器与虚拟机的区别 安装Docker源码安装yum安装检查Docker Docker 镜像操作配置镜像加速器(阿里系)搜索镜像获取镜像查看镜像信息…

【STM32 IDE】使用STM32CubeIDE创建一个工程

关于IDE的下载安装和环境配置这里暂且不介绍,我们直接使用STM32F407ZGT6创建工程。 这里需要注意两点: 创建工程时,默认使用最新版本的固件包(HAL库),好像还不让更改。如果本地电脑位置没有该版本的包&…

Porfinet从转Ethernet/IP从总线协议转换网关

产品功能 1. 远创智控YC-PN-EIP型是Porfinet从转Ethernet/IP从工业级Porfinet 网关。‌这种网关设备允许将Porfinet网络中的设备连接到Ethernet/IP网络中,‌从而实现不同工业通信协议之间的互操作性。‌这些网关设备通常具有两个以太网接口,‌分别用于连…

怎么将几个pdf合成为一个pdf?几个合并PDF文件的方法

怎么将几个pdf合成为一个pdf?当需要将多个PDF文件合并成一个单一的PDF文件时,这种操作不仅能够提高文件管理的效率,还能使得相关文档更加集中和易于访问。合并PDF的过程不仅仅是简单地将几个文件结合在一起,更是将信息整合成一个更…

达梦数据库的系统视图v$recover_status

达梦数据库的系统视图v$recover_status 在达梦数据库(DM Database)中,V$RECOVER_STATUS 是一个系统视图,用于显示数据库的恢复状态信息。这个视图对于数据库管理员来说非常重要,尤其是在数据库发生故障需要进行恢复操…

Vue学习---vue cli 项目创建

使用的编辑工具webStorm 创建例子: hello vue create hello 选择 vue3 进行创建 运行 npm run serve 测试访问:http://localhost:8080 改动内容重新编译: npm run build dist 目录就是编译后的可运行内容

3.外部中断

文章目录 中断原理代码实现过程中断源中断处理函数中断寄存器中断控制寄存器中断优先级寄存器(暂不学)中断允许寄存器 中断代码 中断原理 你在打游戏,水开了,水壶发出响声,你停止打游戏,去倒水&#xff0c…

8 多输出预测与多标签分类pytorch网络搭建

文章目录 前言一、多输出预测(回归)1 坐标数据生成2 网络搭建训练预测二、多标签分类1 多标签数据生成2 网络搭建训练总结前言 前面我们搭建的无论是分类还是回归都只能预测一个标签,这显然效果很局限。下面我们想做到下面这两种效果: 多输出预测(回归):例如训练网络拟…

谷歌浏览器插件-多语言翻译插件-免费好用简单开源

使用说明: 基于translate.js 实现的 免费 谷歌多语言翻译插件 不能确保永久有效! 谷歌浏览器翻译插件,支持中、英、日、韩、俄、中文繁体多种语言翻译~ 使用说明 : 第一步: 把收到的压缩包解压出来,放到…

拒绝废话:computed、watch和methods的区分和使用场景

computed、watch和methods是用于处理数据和响应数据变化的不同方式,三者之间有什么不同呢,贝格前端工场作为10年前端老司机,用浅显的语言给大家分享一下。 computed: computed属性是用来定义一个基于依赖的响应式属性。它会根据…

系统测试-白盒测试学习

目录 1、语句覆盖法: 2、判定覆盖法: 3、条件覆盖法: 4、判定条件覆盖: 5、条件组合的覆盖: 6、路径覆盖: 黑盒:需求 白盒:主要用于单元测试 1、语句覆盖法: 程序…