MySQL__锁

文章目录

😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题: MySQL__锁)
⏱️ @ 创作时间:2024年04月27日
————————————————

这里写目录标题

  • 文章目录
  • 什么是MySQL的锁?
    • 表锁与行锁有什么区别
    • 行级锁使用注意什么?
    • InnoDB 有哪几类行锁?
      • 间隙锁 和 临表锁的使用?
    • 共享锁与排他锁?
    • 什么是意向锁?
    • 当前读与快照读区别?
      • 快照读(一致性非锁定读)
      • 当前读 (一致性锁定读)

什么是MySQL的锁?

锁是一种常见的并发事务的控制方式。

表锁与行锁有什么区别

  • 表级锁: MySQL 中锁定粒度最大的一种锁,是针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。不过,触发锁冲突的概率最高,高并发下效率极低。表级锁和存储引擎无关,MyISAM 和 InnoDB 引擎都支持表级锁。
  • 行级锁: MySQL 中锁定粒度最小的一种锁,是 针对索引字段加的锁 ,只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。行级锁和存储引擎有关,是在存储引擎层面实现的。
    1. 什么叫做针对索引字段加锁?
    针对索引字段加锁是指在执行 SQL 操作时,数据库会根据索引来对数据行进行加锁,而不是对整个表进行加锁。这样的锁定方式被称为行级锁,因为它仅锁定正在操作的行,而不是整个表。
    2. 如果查询不走索引字段, 那还怎么加锁, 直接加表锁吗?
    别说,还真是. 如果不走索引, 那他查询时候不知道给哪一行数据加锁, 就只能给表加锁了. 此时就根据操作语句来看是加什么锁, 看是共享锁还是独占锁. InnoDB存储引擎一般对于普通的查询语句来说都是加共享锁
  • 当查询字段是索引字段时,MySQL 可以直接利用索引进行定位,并且只需要锁定索引对应的行,而不需要锁定整个表或者额外的间隙。这样可以最大程度地减少锁定的范围,提高并发性能,同时确保了事务的隔离性和一致性。
  • 当查询字段不是索引字段时,MySQL 需要进行全表扫描或者范围扫描,无法直接利用索引定位到符合条件的行。在这种情况下,为了保证查询结果的一致性,MySQL 可能会使用表级锁定或者间隙锁,以确保事务之间不会出现干扰或者幻读现象。这会增加锁定的范围,降低并发性能,但能保证数据的完整性。

行级锁使用注意什么?

InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中唯一索引或者索引失效的话,就会导致扫描全表对表中的所有行记录进行加锁。这个在我们日常工作开发中经常会遇到,一定要多多注意!!!

InnoDB 有哪几类行锁?

  • 记录锁:也被称为记录锁,属于单个行记录上的锁。

  • 间隙锁:锁定一个范围,不包括记录本身。

  • 临键锁:临键锁是查询时InnoDB根据查询的条件而锁定的一个范围,这个范围中包含有间隙锁和记录锁;临键锁=间隙锁+记录锁。
    其设计的目的是为了解决Phantom Problem(幻读);主要是阻塞insert,但由于临键锁中包含有记录锁,因此临键锁所锁定的范围内如果包含有记录,那么也会给这些记录添加记录锁,从而造成阻塞除insert之外的操作;

间隙锁 和 临表锁的使用?

在默认情况下, InnoDB在RR的事务级别下, 使用间隙锁和索引扫描来防止幻读的情况, 在默认的隔离级别 RR下,行锁默认使用的是 Next-Key Lock(临键锁)。

  • 如果操作的索引是唯一索引或主键, 数据存在情况

就会将临键锁降级为记录所只对操作的数据进行加锁, 仅仅是锁住索引本身,而不是范围。

  • 如果Sql语句的条件判断字段如果为唯一索引,且给不存在的记录加锁时,行锁会优化为间隙锁给前后间隙加锁。例如:

在这里插入图片描述

记录3-8, 已经被事务1锁住了导,导致事务2inset不了

  • 如果Sql语句的条件判断字段如果为非唯一索引, 那么就会给此数据, 以及此数据前后的数据加上间隙锁

在这里插入图片描述
比如查询:

SELECT * FROM cum WHERE age = 6 LOCK IN SHARE MODE,那么id为(1,6][6,10)的数据会加锁。  
  • 范围查询的Sql语句的条件判断字段如果为唯一索引,会将此行数据和后面的全部间隙加上锁。例如:

比如执行:

SELECT * FROM cum WHERE id >= 10 LOCK IN SHARE MODE,那么会将[10,无穷大)加锁。

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

对于行锁(记录锁, 间隙锁, 临表锁)都是区分一个共享锁和排他锁的

共享锁与排他锁?

不论是表级锁还是行级锁,都存在共享锁(S 锁)和排他锁(X 锁)这两类:

  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁。
    排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。

在这里插入图片描述
由于 MVCC 的存在,对于一般的 SELECT 语句,InnoDB 不会加任何锁, 都是使用 一致性非锁定读的方式来加共享锁方式
不过, 你可以通过以下语句显式加共享锁或排他锁。

 # 共享锁
SELECT ... FOR SHARE;
# 排他锁
SELECT ... FOR UPDATE;

什么是意向锁?

如果需要用到表锁的话,如何判断表中的记录没有行锁呢,一行一行遍历肯定是不行,性能太差。
我们需要用到一个叫做意向锁的东东来快速判断是否可以对某个表使用表锁。

意向锁是表级锁,共有两种:

  • 意向共享锁 :事务有意向对表中的某些记录加共享锁(S 锁),加共享锁前必须先取得该表的 意向共享锁。
  • 意向排他锁:事务有意向对表中的某些记录加排他锁(X 锁),加排他锁之前必须先取得该表的意向排他锁。

意向锁是由数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享/排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。

这种机制可以帮助快速判断表中的记录是否被锁定,从而优化锁定的策略,减少不必要的等待时间和资源浪费。

当前读与快照读区别?

快照读(一致性非锁定读)

就是单纯的 SELECT 语句,但不包括下面这两类 SELECT 语句:

# 排他
SELECT ... FOR UPDATE
# 共享锁  
SELECT ... LOCK IN SHARE MODE;
# 共享锁 
SELECT ... FOR SHARE;

快照即记录的历史版本,每行记录可能存在多个历史版本(这是数据库的多版本技术)。
快照读的情况下,如果读取的记录正在执行 UPDATE/DELETE 操作,读取操作不会因此去等待记录上 X 锁的释放,而是会去读取行的一个快照
只有在事务隔离级别 RC(读取已提交) 和 RR(可重读)下,InnoDB 才会使用一致性非锁定读:

  • 在 RC 级别下,对于快照数据,一致性非锁定读总是读取被锁定行的最新一份快照数据。这也就是为什么会导致不可重复读的原因
  • 在 RR 级别下,对于快照数据,一致性非锁定读总是读取本事务开始时的行数据版本。快照读比较适合对于数据一致性要求不是特别高且追求极致性能的业务场景。

当前读 (一致性锁定读)

就是给行记录加 X 锁或 S 锁。

当前读的常用语句如下

# 加一个X锁
SELECT...FOR UPDATE
# 加一个S锁
SELECT...LOCK IN SHARE MODE
# 加一个S锁
SELECT...FOR SHARE
# 加一个X锁
INSERT...
UPDATE...
DELETE...

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

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

相关文章

刷题训练之前缀和

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握前缀和算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷题…

【Hadoop】-HDFS的存储原理[4]

目录 前言 一、fsck命令 1、HDFS副本块数量的配置 2、fsck命令查看文件的副本数 3、block配置 二、NameNode元数据 1、edits文件 2、fsigame文件 3、NameNode元数据管理维护 4、元数据合并控制参数 5、SecondaryNameNode的作用 三、HDFS数据的读写流程 1、数据写入…

Pytorch 之torch.nn初探 卷积--Convolution Layers

任务描述 本关任务: 本关提供了一个Variable 类型的变量input,按照要求创建一 Conv1d变量conv,对input应用卷积操作并赋值给变量 output,并输出output 的大小。 相关知识 卷积的本质就是用卷积核的参数来提取原始数据的特征&a…

前端HTML5学习1(新增布局,状态,列表,文本,表单控件标签)

前端HTML5学习1(新增布局,状态,列表,文本,表单控件标签) 新增布局标签新增状态标签新增列表标签新增文本标签新增表单控件属性input新增属性值 新增布局标签 HTML5 引入了许多新的语义化标签,用…

【MySQL】A01、性能优化-参数监控分析

1、参数监控 1.1、MySQL command 查看 mysql>SHOW STATUS; (服务器状态变量,运行服务器的统计和状态指标) mysql> SHOW VARIABLES;(服务器系统变量,实际上使用的变量的值) mysql> SHOW STATUS …

SpringBoot---------Hutool

第一步&#xff1a;引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-parent</artifactId><version>5.7.17</version></dependency> 第二步&#xff1a;各种用法 ①生成随机数 //生成验证码 String s …

Linux磁盘管理与文件系统

目录 一.磁盘基础 磁盘结构 二.MBR 磁盘分区结构 三.文件系统类型 XFS文件系统 SWAP&#xff0c;交换文件系统 四.磁盘分区 linux系统添加并使用新硬盘的步骤 五 .创建文件系统 mkfs mkfs命令 挂载、卸载文件系统 挂载文件系统、ISO镜像到指定文件夹 ​编辑umount…

Redis可视化工具RedisInsight

下载地址&#xff1a;RedisInsight - The Best Redis GUIRedisInsight provides an intuitive and efficient graphical interface for Redis, allowing you to interact with your databases and manage your data.https://redis.com/redis-enterprise/redis-insight/#insight…

IDEA上配置Maven环境

1.选择IDEA中的Setting 2.搜索maven 3.设置IDEA使用本地安装的Maven&#xff0c;并修改配置文件路径 配置文件&#xff0c;本地仓库&#xff0c;阿里云仓库配置及路径教程 在IDEA上配置完成。

【Linux内核驱动基础】从零开始手搓一个从上层应用到底层驱动的IO口代码

【Linux内核驱动基础】从零开始手搓一个从上层应用到底层驱动的IO口控制代码 文章目录 【Linux内核驱动基础】从零开始手搓一个从上层应用到底层驱动的IO口控制代码一、驱动基础认知1.为什么要学会写驱动2.文件名与设备号3.open函数从上层打通到底层硬件的详细过程 二、基于内核…

【强训笔记】day4

NO.1 思路&#xff1a;利用滚动数组&#xff0c;迭代一个Fibonacci数列&#xff0c;给出三个值进行循环迭代&#xff0c;当n<c时&#xff0c;说明n在b和c之间&#xff0c;这里只需要返回c-n和n-b的最小值就可以了。 代码实现&#xff1a; #include<iostream>using n…

打印给定数组中每一个数字

如何给定1-10的数字 #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };// 0 9//[]--下标引用操作符int i;int sz sizeof(arr) / sizeof(arr[0]);//10个数for (i 0; i < sz; i){printf("%d ", arr[i]);}re…

centos7使用源码安装方式redis

安装编译源码的工具gcc yum install -y gcc下载源码 源码下载地址 https://download.redis.io/releases/ 注意事项 不建议安装最新版本redis&#xff0c;所以我这里选择6.2.6版本 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz解压 tar -zxvf redis-…

单片机通讯协议

参考&#xff1a;江科大单片机教程 STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili IIC通讯协议SPI通信协议UARTCANUSB速度100k-400khz4Mhz-线数2 CLK,DATA4CLK,ENB,IO,OI额外设备一主多从一主多从 一般不用自己写&#xff0c;都有相应的库或官方提供相应的&#…

舌头分割YOLOV8-SEG

舌头分割&#xff0c;基于YOLOV8-SEG&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;从而摆脱YOLO依赖&#xff0c;支持C,PYTHON,ANDROID开发 舌头分割YOLOV8-SEG

使用预训练模型构建自己的深度学习模型(迁移学习)

在深度学习的实际应用中&#xff0c;很少会去从头训练一个网络&#xff0c;尤其是当没有大量数据的时候。即便拥有大量数据&#xff0c;从头训练一个网络也很耗时&#xff0c;因为在大数据集上所构建的网络通常模型参数量很大&#xff0c;训练成本大。所以在构建深度学习应用时…

OS对软件的管理,进程,PCB、子进程

进程 可执行程序加载到内存中&#xff0c;操作系统为内个程序都形成一个PCB对象&#xff08;结构体对象&#xff09;&#xff0c;PCB里存放着这个程序的所有的属性。进程可执行程序PCB &#xff0c;CPU执行程序也是先通过该程序的PCB找到相应的程序代码&#xff0c;然后一条一…

ThinkPHP5 SQL注入漏洞敏感信息泄露漏洞

1 漏洞介绍 ThinkPHP是在中国使用极为广泛的PHP开发框架。在其版本5.0&#xff08;<5.1.23&#xff09;中,开启debug模式&#xff0c;传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…