MySQL-SQL全部锁详解(下)

♥️作者:小刘在C站

♥️个人主页: 小刘主页 

♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生!

♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术

♥️小刘私信可以随便问,只要会绝不吝啬,感谢CSDN让你我相遇!

前言

上章讲述了MySQL-SQL语言中的全部锁上章,本章完结继续上一张点这里上一张点这里         

目录

4 行级锁

4.1 介绍

​编辑

 4.2 行锁

1). 介绍

 2). 演示

示例演示

A. 普通的select语句,执行时,不会加锁。

 B. select...lock in share mode,加共享锁,共享锁与共享锁之间兼容。

C. 排它锁与排他锁之间互斥

D. 无索引行锁升级为表锁

4.3 间隙锁&临键锁

示例演示

介绍分析一下:


                                              

4 行级锁

4.1 介绍

行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB 存储引擎中。
InnoDB 的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
行锁( Record Lock ):锁定单个行记录的锁,防止其他事务对此行进行 update delete 。在
RC RR 隔离级别下都支持。
间隙锁( Gap Lock ):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事
务在这个间隙进行 insert ,产生幻读。在 RR 隔离级别下都支持。
临键锁( Next-Key Lock ):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙 Gap
RR 隔离级别下支持。

 4.2 行锁

1). 介绍

InnoDB 实现了以下两种类型的行锁:
共享锁(S ):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
排他锁( X ):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他
锁。
两种行锁的兼容情况如下 :

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

 2). 演示

默认情况下, InnoDB REPEATABLE READ 事务隔离级别运行, InnoDB 使用 next-key 锁进行搜
索和索引扫描,以防止幻读。
针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
InnoDB 的行锁是针对于索引加的锁,不通过索引条件检索数据,那么 InnoDB 将对表中的所有记
录加锁,此时 就会升级为表锁。
可以通过以下 SQL ,查看意向锁及行锁的加锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema.data_locks;

示例演示

数据准备 :
CREATE TABLE `stu` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int NOT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4;
INSERT INTO `stu` VALUES (1, 'tom', 1);
INSERT INTO `stu` VALUES (3, 'cat', 3);
INSERT INTO `stu` VALUES (8, 'rose', 8);
INSERT INTO `stu` VALUES (11, 'jetty', 11);
INSERT INTO `stu` VALUES (19, 'lily', 19);
INSERT INTO `stu` VALUES (25, 'luci', 25);
演示行锁的时候,我们就通过上面这张表来演示一下。

A. 普通的select语句,执行时,不会加锁。

 B. select...lock in share mode,加共享锁,共享锁与共享锁之间兼容。

 共享锁与排他锁之间互斥。

客户端一获取的是 id 1 这行的共享锁,客户端二是可以获取 id 3 这行的排它锁的,因为不是同一行数据。 而如果客户端二想获取 id 1 这行的排他锁,会处于阻塞状态,以为共享锁与排他锁之间互 斥。

C. 排它锁与排他锁之间互斥

当客户端一,执行 update 语句,会为 id 1 的记录加排他锁; 客户端二,如果也执行 update 语句更
id 1 的数据,也要为 id 1 的数据加排他锁,但是客户端二会处于阻塞状态,因为排他锁之间是互斥的。 直到客户端一,把事务提交了,才会把这一行的行锁释放,此时客户端二,解除阻塞。 

D. 无索引行锁升级为表锁

stu 表中数据如下 :

 我们在两个客户端中执行如下操作:

在客户端一中,开启事务,并执行 update 语句,更新 name Lily 的数据,也就是 id 19 的记录 。
然后在客户端二中更新 id 3 的记录,却不能直接执行,会处于阻塞状态,为什么呢?
原因就是因为此时,客户端一,根据 name 字段进行更新时, name 字段是没有索引的,如果没有索引, 此时行锁会升级为表锁 ( 因为行锁是对索引项加的锁,而 name 没有索引 )
接下来,我们再针对 name 字段建立索引,索引建立之后,再次做一个测试:

此时我们可以看到,客户端一,开启事务,然后依然是根据 name 进行更新。而客户端二,在更新 id 3的数据时,更新成功,并未进入阻塞状态。 这样就说明,我们根据索引字段进行更新操作,就可以避免行锁升级为表锁的情况。

4.3 间隙锁&临键锁

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

示例演示

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

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

介绍分析一下:

我们知道 InnoDB B+ 树索引,叶子节点是有序的双向链表。 假如,我们要根据这个二级索引查询值为 18 的数据,并加上共享锁,我们是只锁定 18 这一行就可以了吗? 并不是,因为是非唯一索引,这个结构中可能有多个 18 的存在,所以,在加锁时会继续往后找,找到一个不满足条件的值(当前案例中也 就是 29 )。此时会对 18 加临键锁,并对 29 之前的间隙加锁。

 

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

查询的条件为 id>=19 ,并添加共享锁。 此时我们可以根据数据库表中现有的数据,将数据分为三个部分:
[19]
(19,25]
(25,+∞]
所以数据库数据在加锁是,就是将 19 加了行锁, 25 的临键锁(包含 25 25 之前的间隙),正无穷的临键锁 ( 正无穷及之前的间隙 )

♥️关注,就是我创作的动力

♥️点赞,就是对我最大的认可

♥️这里是小刘,励志用心做好每一篇文章,谢谢大家

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

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

相关文章

C++之工厂模式

目录 一、为什么要使用工厂模式 优点 缺点 二、简单工厂(Simple Factory) 好处: 不足: 三、工厂方法: 好处: 不足: 四、抽象工厂(Abstract Factory) 一、为什…

【软考网络管理员】2023年软考网管初级常见知识考点(10)- 网际协议IP及IPV6,IPV4详解

涉及知识点 分类的IP地址,子网划分,CIDR和路由汇聚,IPV4数据报格式,IPV6协议,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学…

数据分析案例-航空公司满意度数据可视化

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【算法之贪心算法IV】leetcode56. 合并区间

452. 用最少数量的箭引爆气球 力扣题目链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴…

IDEA字体配置

IDEA默认字体:JetBrains Mono 1、下载Monaco字体(windows版):下载地址👈 2、双击安装 3、在IDEA中切换Monaco字体

C++ DAY3

1.思维导图 2.有以下类定义&#xff0c;按要求实现剩余功能 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person(int age,int num){this->age age;this->pne…

【MySQL】SQL的函数用法

文章目录 聚合函数Count()Max()Min()Sum()Avg() 其他常用函数时间函数字符串函数SUBSTRING函数:切割字符串([start:end])SUBSTRING_INDEX函数:切割字符串(split)LOWER&UPPER函数:大小写转化CONCAT&CONCAT_WS函数:连接字符串REPLACE函数:字符串替换 数学函数ROUND函数:四…

Spring Boot高阶篇笔记

一、Spring Boot整合Redis缓存 JSR-107、Spring缓存抽象、整合Redis 1、JSR107 Java Caching定义了5个核心接口&#xff0c;分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应…

一点基础、但一直没分清的概念2023/06/28

文章目录 1.export和export default的区别2.npm和cnpm的区别3.npm run dev/serve的区别4.slice、splice和split的区别 1.export和export default的区别 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输…

MySQL事务与存储引擎

MySQL事务与存储引擎 MySQL事务一、事务的概念二、事务的ACID特点1、原子性2、一致性3、隔离性4、持久性&#xff08;Durability&#xff09;总结 三、事务之间的相互影响1、脏读2、不可重复读3、幻读4、丢失更新 四、Mysql及事物隔离级别1、查询全局事务隔离级别2、查询会话事…

npm 包 - serve 使用

前端打包后&#xff0c;或者本地的html文件。有时需要将打包好的项目跑一下看看效果&#xff0c;这时就可以使用 serve 工具&#xff0c;在本地启动一个静态文件服务器。本文主要简单记录下 npm 包 serve 的基本使用命令。 一、全局安装 serve npm install serve -g二、运行 s…

文心一言眼里的Java世界

目录 一、Java基础教程系列二、先听听文心一言怎么说&#xff1f;三、话不多说&#xff0c;开干。1、要有一个正确的Java学习路线&#xff0c;做一个细致的Java学习规划。2、学习资料推荐3、书中自有黄金屋&#xff0c;书中自有颜如玉4、自学周期推荐5、效率为先6、哪吒的学习方…