Mysql----锁

news2024/11/25 7:28:25

文章目录

  • 锁 概述
    • 全局锁
    • 全局锁 概述
    • 全局锁 操作
    • 表级锁
    • 表级锁 表锁
    • 表级锁 元数据锁
    • 表级锁 意向锁
    • 行级锁
    • 行级锁 行锁
    • 行级锁 间隙锁&临键锁

锁 概述

是什么

是计算机协调多个进程或线程并发访问某一资源的机制。

意义

在数据库中,数据是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

MySQL中的锁,按照锁的粒度分,分为以下三类

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

全局锁

全局锁 概述

是什么

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

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

意义 为了解决因备份完成时,又更新数据库但是没有更新备份而导致数据不一致的问题。

如下举例说明 当没有加锁备份的同时更新数据时

image-20220504232933965

  1. 在进行数据备份时,先备份了tb_stock库存表。
  2. 然后接下来,在业务系统中,执行了下单操作,扣减库存,生成订单(更新tb_stock表,插入tb_order表)。
  3. 然后再执行备份 tb_order表的逻辑。
  4. 业务中执行插入订单日志操作。
  5. 最后,又备份了tb_orderlog表。

=>备份出来的数据中,tb_stock表与tb_order表的数据不一致(有最新操作的订单信息,但是库存数没减)

如下举例说明 加锁后

image-20220504233256306

特点

  • 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  • 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

全局锁 操作

操作 加全局锁

#加全局锁
flush tables with read lock ;

#数据备份
##注意不要在mysql命令行中执行下面语句,而是在任意磁盘路径的命令行下执行该操作(这是因为它是mysql的一个工具而不是语句)
mysqldump -uroot –p1234 itcast > itcast.sql

#释放锁
unlock tables ;

操作 不加全局锁

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

mysqldump --single-transaction -uroot –p123456 itcast > itcast.sql

 
 

表级锁

是什么

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

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

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

表级锁 表锁

对于表锁,分为两类

  • 表共享读锁(read lock)
  • 表独占写锁(write lock)

读锁作用 过程图说明

左侧为客户端一,对指定表加了读锁,不会影响右侧客户端二的读,但是会阻塞右侧客户端的写。
在这里插入图片描述

写锁作用 过程图说明

左侧为客户端一,对指定表加了写锁,会阻塞右侧客户端的读和写。

image-20220505103753708

操作 语法

加锁:
lock tables 表名... read/write。
s
释放锁:
unlock tables / 客户端断开连接 

表级锁 元数据锁

是什么

  • meta data lock , 元数据锁,简写MDL。
  • MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。

MDL锁主要作用

  • 维护表元数据的数据一致性。就是在表上有活动事务的时候,不可以对元数据进行写入操作。
  • 为了避免DM与DDL冲突,保证读写的正确性。

@元数据

  • 可以简单理解为就是一张表的表结构。
  • 也就是说,某一张表涉及到未提交的事务时,是不能够修改这张表的表结构的。

加锁 机制

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

image-20220505104545212

  • @互斥就是 当执行alter操作、而当其他事务未提交时,alter操作会处在阻塞状态

查看数据库中的元数据锁的情况

select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks ;

 
 

image-20220505105231810

表级锁 意向锁

为什么

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

为什么 举例说明

image-20220505105631559

当客户端二,想对这张表加表锁时,会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。

image-20220505105659237

其他客户端,在对这张表加表锁的时候,会根据该表上所加的意向锁来判定是否可以成功加表锁,而不用逐行判断行锁情况了。

意向锁 分类

  • 意向共享锁(IS): 由语句select … lock in share mode添加 。 与 表锁共享锁(read)兼容,与表锁排他锁(write)互斥。
  • 意向排他锁(IX): 由insert、update、delete、select…for update添加(自动添加) 。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。
  • 一旦事务提交了,意向共享锁、意向排他锁,都会自动释放。

查看意向锁及行锁的加锁情况

select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

 
 
>

行级锁

是什么

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

原理

InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。

行锁(Record Lock)

锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传image-20220505110637928

间隙锁(Gap Lock)

锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

image-20220505110649073

临键锁(Next-Key Lock)

行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。 在RR隔离级别下支持。

image-20220505110658169

行级锁 行锁

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

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

两种行锁的兼容情况如下

image-20220505111243631

常见的SQL语句,在执行时,所加的行锁如下

image-20220505111304853

行锁 特点

  • 默认情况下,InnoDB在 REPEATABLE READ事务隔离级别运行,InnoDB使用 next-key 锁进行搜索和索引扫描,以防止幻读。
  • 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
  • InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。

行级锁 间隙锁&临键锁

间隙锁&临键锁 特点

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

  • 索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。
  • 索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock 退化为间隙锁。
  • 索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。
  • 间隙锁唯一目的是 防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用间隙锁。

举例 说明

索引上的等值查询(唯一索引),给不存在的记录加锁时, 优化为间隙锁 。

image-20220505111843178

索引上的等值查询(非唯一普通索引),向右遍历时最后一个值不满足查询需求时,next-keylock 退化为间隙锁。

我们知道InnoDB的B+树索引,叶子节点是有序的双向链表。 假如,我们要根据这个二级索引查询值为18的数据,并加上共享锁

我们是只锁定18这一行就可以了吗?并不是,因为是非唯一索引,这个结构中可能有多个18的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(当前案例中也就是29)。此时会对18加临键锁,并对29之前的间隙加锁。

image-20220505111909433

索引上的范围查询(唯一索引)–会访问到不满足条件的第一个值为止。

image-20220505111926620

查询的条件为id>=19,并添加共享锁。 此时我们可以根据数据库表中现有的数据,将数据分为三个部分:

  • [19]
  • (19,25]
  • (25,+∞]

所以数据库数据在加锁是,就是将19加了行锁,25的临键锁(包含25及25之前的间隙),正无穷的临键锁(正无穷及之前的间隙)。

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

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

相关文章

C/C++计算分数的浮点数值 2019年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C计算分数的浮点数值 一、题目要求 1、编程实现 2、输入输出 二、解题思路 1、案例分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 C/C计算分数的浮点数值 2019年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 两个整数a和b分别作…

每日一题 337. 打家劫舍 III

难度:中等 整体思路相当于是前两天的方法倒过来,毕竟二叉树最常用的解法就是递归倒推 对于每一颗子树,他必定有一种最大的盗取方法,但是只有它的 root 的盗取情况才会影响到 root 的父节点,即如果收益最大的盗取方法…

【TCP】滑动窗口、流量控制 以及拥塞控制

滑动窗口、流量控制 以及拥塞控制 1. 滑动窗口(效率机制)2. 流量控制(安全机制)3. 拥塞控制(安全机制) 1. 滑动窗口(效率机制) TCP 使用 确认应答 策略,对每一个发送的数…

机器学习第七课--情感分析系统

分词 分词是最基本的第一步。无论对于英文文本,还是中文文本都离不开分词。英文的分词相对比较简单,因为一般的英文写法里通过空格来隔开不同单词的。但对于中文,我们不得不采用一些算法去做分词。 常用的分词工具 # encodingutf-8 import …

Linux C 多线程

为什么会有线程? ————————>>>> 进程实现多任务的缺点: 进程间切换的计算机资源开销很大,切换效率非常低进程间数据共享的开销也很大 线程和进程的关系 线程是进程的一个执行单元,是进程内的调度实体。比进程…

应用:使用#todo标签,清理未完成笔记 | Obsidian实践

各位【见睿思齐】的朋友,好久不见。断更了这么久,非常抱歉。起初是因为家里出了些事情,不得不断更了一段时间;后来是因为断更太久,找不回写作的感觉,于是又断更了更久的时间……总之是太不应该。最近读了一…

ESLint+Prettier+VSCode编程规范

编程规范 ESLintPrettierESLint和Prettier配合解决代码格式化问题1. 在VSCode搜索Prettier插件安装2. 创建prettier配置文件3. 在VSCode中设置3.1 找到左下角设置图标,点击设置3.2 但是对VSCode 而言,默认一个 tab 等于 4 个空格,而 ESLint 希…

【Hierarchical Coverage Path Planning in Complex 3D Environments】

Hierarchical Coverage Path Planning in Complex 3D Environments 复杂三维环境下的分层覆盖路径规划 视点采样全局TSP 算法分两层,一层高级一层低级: 高层算法将环境分离多个子空间,如果给定体积中有大量的结构,则空间会进一步细…

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测 1. 图像分类 vs. 目标检测 图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。 在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还…

软件工程之总体设计

总体设计是软件工程中的一个重要阶段,它关注整个系统的结构和组织,旨在将系统需求转化为可执行的软件解决方案。总体设计决定了系统的架构、模块划分、功能组织以及数据流和控制流等关键方面。 可行性研究 具体方面:经济可行性、技术可行性…

如何正确安装滚珠螺杆螺母?

在安装滚珠螺母时,相信很多人都遇到过装反这个问题,滚珠螺杆螺母是通过高精度的加工和配合实现传递转矩和运动的,如果将滚珠螺杆螺母反过来装,会导致导向槽和调整垫片位置不正确,使得整个螺杆系统的传动精度降低&#…

sketch for Mac快捷键大全

你可以在sketch中使用键盘快捷键来加快你的设计过程。要使用键盘快捷键,请同时按下下列列表的所有键。有些命令只能根据你在做什么或者你选择了什么才启用,所有把命令分成了下列不同的部分。 sketch下载地址:sketch 破解-Sketch for mac(专业…

Linux 信号集 及其 部分函数

这几个函数都是对自己自定义的信号集操作 int sigemptyset(sigset_t *set) 功能:清空信号集中的数据,将所有的标志位置为0 参数:set需要操作的信号集 返回值:成功0失败-1 int sigfillset(sigset_t *set) 功能:清空…

各个浏览器离线安装包获取方式

前言 我们一般去浏览器官网下载所谓的官方版浏览器,但是如今呢,下载的都是在线安装包,大小大约1~2MB,安装时电脑必须联网,每次都要从网络上下载。就像下面这样的: 在线安装包的运行必须有网络环境&#…

批量使用cdo 修改分辨率的方法

文件夹里有很多这种grib文件 怎么有2.3T啊,好大,一个一个改太浪费时间了 现在我想用cdo 批量他们的分辨率都降低一些,怎么做呢? find . -name *low.grib |xargs -I{} cdo remapbil,r144x72 {} {}_low.nc 思路:使用 find 命令找到…

小型网络实验组网

路漫漫其修远兮,吾将上下而求索 时隔多日,没有更新,今日一写,倍感教育的乐趣。如果让我每天发无意义的文章,我宁可不发。 实验拓扑 实验要求 (1)内网主机采用DHCP分配IP地址 (2&…

6-3 pytorch使用GPU训练模型

深度学习的训练过程常常非常耗时,一个模型训练几个小时是家常便饭,训练几天也是常有的事情,有时候甚至要训练几十天。 训练过程的耗时主要来自于两个部分,一部分来自数据准备,另一部分来自参数迭代。 当数据准备过程还…

分享一下微信公众号怎么添加砸金蛋链接

一、砸金蛋活动的优势 砸金蛋活动是一种非常有趣且吸引人的互动方式,在微信公众号中添加砸金蛋链接有以下优势: 提高用户参与度:砸金蛋活动能够激发用户的参与度和好奇心,让用户感到有乐趣和刺激。通过砸金蛋的方式,…

现在全国融资融券两融利率最低是多少?哪家证券公司券商费率低?

融资融券是指投资者通过向券商借入资金(融资)或借入证券(融券),以达到获得更高收益、降低交易风险、提高资金利用效率的目的。通过融资,投资者可以用借入的资金买入更多的证券;通过融券&#xf…

乐器商城小程序开发全攻略

随着互联网的普及和电子商务的快速发展,越来越多的人开始通过在线购物来满足自己的需求。而乐器作为一种特殊的商品,其在线销售市场也在不断扩大。为了满足这一需求,许多乐器商家开始开发自己的小程序商城,以提供更加便捷、高效的…