MySQL 进阶(四)【锁】

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.mzph.cn/news/872452.shtml

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

相关文章

2024-07-12升级问题:Android SDK升级导致 Canvas.FULL_COLOR_LAYER_SAVE_FLAG 等标志位无法使用

Canvas.FULL_COLOR_LAYER_SAVE_FLAG 是一个标志位,用于在 Android 的 Canvas 类中保存画布的颜色层。当使用 saveLayer() 方法时,可以传递这个标志位来指示保存整个颜色层。这样,在恢复画布状态时,颜色层也会被恢复。 工程从Andr…

如何通过网络快速搜寻到自己的STM32设备

目录 一、问题概述 二、解决思路 三、代码实现 1.创建任务 2.UDP广播接收 一、问题概述 以前一直用RS232串口修改设备配置信息,但是现场施工人员的232线太细,经常容易断掉,这次准备用网口去修改,遇到了一个问题,…

C语言学习笔记[24]:循环语句while②

getchar()的使用场景 int main() {char password[20] {0};printf("请输入密码:");//输入 123456 后回车scanf("%s", passwoed);//数组名本身就是数组地址printf("请确认密码:Y/N");int ch getchar();if(Y ch)printf(&…

区块链学习05-web3中solidity和move语言

Solidity 和 Move 语言的比较:Web3 开发中的两种选择 Solidity 和 Move 都是用于开发区块链平台智能合约的编程语言。它们具有一些相似之处,但也存在一些关键差异。 相似之处: Solidity 和 Move 都是图灵完备语言,这意味着它们可以表达计算…

JavaEE:Spring Web简单小项目实践二(用户登录实现)

学习目的&#xff1a; 1、理解前后端交互过程 2、学习接口传参&#xff0c;数据返回以及页面展示 1、准备工作 创建SpringBoot项目&#xff0c;引入Spring Web依赖&#xff0c;添加前端页面到项目中。 前端代码&#xff1a; login.html <!DOCTYPE html> <html lang&…

关于window配置gitlab和gitee平台共存

今天使用gitlab拉取代码突然提示 gitgitlab.xxx.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 以为是ssh公钥没有配置好&#xff0c;遂又进行了一番配置&#xff0c;实际上并不是这个问题造成的&#xff0c;但还是想记录一下步骤&#xff0c;以…

<Rust><GUI>rust语言GUI库tauri体验:前、后端结合创建一个窗口并修改其样式

前言 本文是rust语言下的GUI库&#xff1a;tauri来创建一个窗口的简单演示&#xff0c;主要说明一下&#xff0c;使用tauri这个库如何创建GUI以及如何添加部件、如何编写逻辑、如何修改风格等&#xff0c;所以&#xff0c;这也是一个专栏&#xff0c;将包括tauri库的多个方面。…

小阿轩yx-zookeeper+kafka群集

小阿轩yx-zookeeperkafka群集 消息队列(Message Queue) 是分布式系统中重要的组件 通用的使用场景可以简单地描述为 当不需要立即获得结果&#xff0c;但是并发量又需要进行控制的时候&#xff0c;差不多就是需要使用消息队列的时候。 消息队列 什么是消息队列 消息(Mes…

【HarmonyOS开发】弹窗交互(promptAction )

实现效果 点击按钮实现不同方式的弹窗showToast showDialog showActionMenu 代码实现 1.引入’ohos.promptAction’ import promptAction from ohos.promptAction;2.通过promptAction 实现系统既定的弹窗 import promptAction from ohos.promptAction;Entry Component st…

鸿蒙语言基础类库:【@system.geolocation (地理位置)】

地理位置 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.geolocation]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import geolocation from …

C++客户端Qt开发——常用控件QWidget

四、常用控件 属性 作用 enabled 设置控件是否可使用.true 表⽰可用&#xff0c;false 表示禁用 geometry 位置和尺寸&#xff0c;包含x,y,width,height四个部分 其中坐标是以⽗元素为参考进行设置的. windowTitle 设置widget标题 windowIcon 设置widget图标 windowO…

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

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

注意力机制中三种掩码技术详解和Pytorch实现

注意力机制是许多最先进神经网络架构的基本组成部分&#xff0c;比如Transformer模型。注意力机制中的一个关键方面是掩码&#xff0c;它有助于控制信息流&#xff0c;并确保模型适当地处理序列。 在这篇文章中&#xff0c;我们将探索在注意力机制中使用的各种类型的掩码&…

【瑞吉外卖 | day07】移动端菜品展示、购物车、下单

文章目录 瑞吉外卖 — day71. 导入用户地址簿相关功能代码1.1 需求分析1.2 数据模型1.3 代码开发 2. 菜品展示2.1 需求分析2.2 代码开发 3. 购物车3.1 需求分析3.2 数据模型3.3 代码开发 4. 下单4.1 需求分析4.2 数据模型4.3 代码开发 瑞吉外卖 — day7 移动端相关业务功能 —…

MySQL 一行记录是怎么存储的

文章目录 1. 文件存放目录 && 组织2. 表空间文件的结构3. InnoDB 行格式4. Compact 行格式记录的额外信息1. 变长字段长度列表2. NULL 值列表3. 记录头信息 记录的真实数据1. 定义的表字段2. 三个隐藏字段 5. varchar(n) 中 n 最大取值为多少&#xff1f;6. 行溢出后&a…

pnpm install安装失败

ERR_PNPM_META_FETCH_FAIL GET https://registry.npmjs.org/commitlint%2Fcli: request to https://registry.npmjs.org/commitlint%2Fcli failed, reason: connect ETIMEDOUT 2606:4700::6810:123:443 1. 检查网络连接 确保你的网络连接正常并且没有被防火墙或代理服务器阻止…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建

按照作者在读者寄语中的说法&#xff1a;我们得榨干这本书的知识。 带着问题 为了更好的学习&#xff0c;我们最好带着问题去探索。 第一&#xff1a;核心问题与基础知识 如上图&#xff1a;这本书介绍了SLAM相关的核心问题和基础知识。王谷博士给我们做了梳理&#xff1a;…

数据结构(4.1)——树的性质

结点数总度数1 结点的度——结点有几个孩子(分支) 度为m的树、m叉树的区别 度为m的树第i层至多有 个结点(i>1) 高度为h的m叉树至多有 个结点 高度为h的m叉树至少有h个结点 、高度为h&#xff0c;度为m叉树至多有hm-1个结点 具有n个结点的m叉树的最小高度为 总结

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…

EXCEL VBA工程密码破解 工作表保护破解

这里写目录标题 破解Excel宏工程加密方法一 新建破解宏文件方法二 修改二进制文件 破解工作表保护引用 破解Excel宏工程加密 如图所示 白料数据处理已工程被加密。 方法一 新建破解宏文件 1 创建一个XLSM文件&#xff0c;查看代码 ALTF11 2 新建一个模块&#xff0c;“插…