MySQL-SQL全部锁详解(下)

news2024/11/25 15:59:49

♥️作者:小刘在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.coloradmin.cn/o/702671.html

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

相关文章

老PM,到底在牛什么?

早上好,我是老原。 “成长为一名优秀的项目经理。”相信这是每一个刚入行的项目经理都会立的flag。 对于项目经理来说,这是一个能力和经验并重的岗位,你应该也经常听人说,这项目经理是一个越老越吃香的职业。 就拿我自己来说&a…

【java】HashMap扩容机制详解

文章目录 JDK1.7下的扩容机制JDK1.8下的扩容机制 JDK1.7下的扩容机制 JDK1.7下的resize()方法是这样的: void resize(int newCapacity) { Entry[] oldTable table; int oldCapacity oldTable.length; if (oldCapacity MAXIMUM_CAPACITY) { threshold Integer.…

零样本视频生成无压力,基于飞桨框架实现Text2Video-Zero核心代码及依赖库

项目背景 继 AI 绘画之后,短视频行业正迎来 AI 智能创作的新浪潮。AI 智能创作正在各个方面为创作者和用户带来新的体验和价值。AI 动漫视频、AI 瞬息宇宙、AI 视频风格化等诸多创作功能不仅为视频内容创作提供了全新灵感,而且大大降低了用户创作的门槛…

SpringMVC原理分析 | 数据处理:ModelAndView

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 重定向和转发 ModelAndView 设置ModelAndView对象,根据view的名称、视图解析器跳转到指定的页面 页面:{视图解析器前缀} viewName {视图解析器…

git常用命令之命令集

15. 命令集 场景1. 构造1个文件的10个commit 命令作用for i in {1..10}; do date >> 66.txt && git add . && git commit -sm "update"; done自证 场景2. 构造10个文件 命令作用for i in {1..10}; do date >> "file_$i.log&quo…

Quiz 7: Files | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 7: Files 单选题(1-10)编程题Exercise 7.2 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course aims to teach everyone the basics of programming computers using Python. 本课程…

项目——学生信息管理系统1

目录 创建项目 1. 修改Eclipse的编码为UTF-8,具体参考给的文档 1.1 设置代码自动保存 2. 创建Java项目 分包 添加数据库驱动jar包依赖 复制数据库驱动jar包到lib目录下 添加依赖 创建登陆页面 在 org.xingyun.view 包下创建 LoginFrm 选择 WindowBuilder下的 Swing D…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题,检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题,子进程一kill掉,就恢复了。

微服务实战项目-学成在线-课程发布模块

学成在线-课程发布模块 1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程,发布课程相当于一个确认操作,课程发布后学习者在网站可以搜索到课程,然后查看课程的详细信息,进一步选课、支付、在线学习。 下边是课程编辑…

视频解说小程序看点小程序搭建上线,流量主对接实现广告收益

什么是视频解说小程序? 影视剪辑和解说,我们都知道有这类的抖音号,这时候就用到我们小程序了,流量主产生了收益。把视频解说上传到小程序,设置为广告观看,这样引导用户去小程序看,就产生一个广告…

(一)等值线 (Spatial Analyst)

等值线 (Spatial Analyst) 1.摘要 根据栅格表面创建等值线(等值线图)的线要素类。 等值线是用于连接各类等值点(如高程、温度、降雨量、污染或大气压力)的线。线的分布显示表面值的变化方式。值的变化量越小,线的间距就越大。值上升或下降得越快,线的间距就越小。 2.…

基于单片机的厨房安全监测

功能介绍 以STM32单片机作为主控系统; OLED液晶显示当前检测的气体浓度,温度,是否有火等信息; 按键可以设置温度上限、可燃气体浓度上限; 当温度超过我们设置自动开启风扇进行降温; 当检测到天然气泄露后蜂…

ROS学习篇之基础知识(一)-环境的安装

文章目录 一.ros的安装1.ros的一键安装:2.ros的验证是否安装成功3.安装导航必备的库: 二.VScode的配置1.安装ros插件2.安装cmake插件 三.VScode的简单使用1.快速注释: 四.pycharm的安装 一.ros的安装 1.ros的一键安装: wget htt…

shiro框架 shiro补充知识MD5加密

01.在用户登录时候,需要输入用户名和密码。 用户名用数据库的select来查询是否存在。 密码比较私密,就是后台的程序员也不可以查看,这需要加密。 一般的加密算法是MD5 02.例如: SecurityUtils 类是shiro框架的一个类。SecurityUt…

LabVIEW开发牵引控制动态仿真器

LabVIEW开发牵引控制动态仿真器 车辆牵引力控制包括轮胎在横向和纵向上的牵引力控制,以获得所需的车辆运动。决定轮胎牵引力的力来自路面和轮胎之间的相互作用,它们分解为两个组成部分:一个在横向,另一个在纵向。第一个组件取决于…

MSP432学习笔记11:定时器A的结构\基地址\函数汇总理解

今日得以继续我的电赛MSP432学习之路:所用开发板MSP432P401R 定时器是任何单片机开发板十分重要的模块,在几日的学习使用过程中,本人也对其使用原理等产生过许多疑问,他究竟是怎么存储计数值、捕获值的?一个定时器四个…

基于Java校园车辆管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048

Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048 Proteus仿真小实验: Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048 功能: 硬件组成:ARDUINO -UNO-R3开发板、 LCD1602 、DHT11温湿度传感器、LED灯、电机模拟水泵、2个按键 1.单…

【详解代码】vue element el-select选择器多选下拉框实现全选功能和取消全选

目录 解决方法 下拉项增加一个【全部】⭐️效果图如下:默认全选情况一:下拉选项全都勾选时,【全部】自动勾选;情况二:下拉选项全都未勾选时,点击【全部】后,所有下拉选项全部勾选;情…

V90伺服驱动器实现一键优化的具体方法

V90伺服驱动器实现一键优化的具体方法 目的:解决运行中震动、异响等问题。 前提条件: 使用一键自动优化的前提:  对于带绝对值编码器的电机:位置限制由p29027决定,至少为180  对于带增量式编码器的电机:在开始优化时必须允许电机有2圈的自由旋转,p29027至少为720 使…