当前位置: 首页 > news >正文

【MySQL】聊聊唯一索引是如何加锁的

首先我们要明确,加锁的对象是索引,加锁的基本单位是next-key lock,由记录锁和间隙锁组成。next-key是前开后闭区间,间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。

在能使用记录锁或者间隙锁就能避免幻读现象的场景下, next-key lock 就会退化成记录锁或间隙锁。

数据准备

CREATE TABLE user (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
age int NOT NULL,
PRIMARY KEY (id),
KEY index_age (age) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

在这里插入图片描述

唯一索引等值查询

本案例其实就是在主键索引上进行等值查询,取决于查询记录是否存在,存在退化成记录锁,否则就是在索引树中找到第一个大于该查询记录的记录后,将改记录的索引中的next-key lock退换成间隙锁。

记录存在

当执行如下 id=1的锁,会给id=1的记录jiashangX型的记录锁

BEGIN;
SELECT * from user where id = 1 for update;

在这里插入图片描述
可以发现对,id=1的记录加了记录锁。update user set age = 25 where id = 1; DELETE FROM user WHERE id = 1; 语句都会被阻塞。

图中 LOCK_TYPE 中的 RECORD 表示行级锁,而不是记录锁的意思
通过 LOCK_MODE 可以确认是 next-key 锁,还是间隙锁,还是记录锁:
如果 LOCK_MODE 为 X,说明是next-key 锁;
如果 LOCK_MODE 为 X, REC_NOT_GAP,说明是记录锁;
如果 LOCK_MODE 为 X,GAP,说明是间隙锁;

这里简单聊下,为什么唯一索引下等值查询就可以将next-key lock退化成记录锁,因为对指定行的操作加锁,可以直接避免其他事务对该行的删除、插入的时候,就可以避免幻读问题。
在这里插入图片描述

记录不存在

好了上面主要说的是针对记录存在,针对记录不存在的唯一索引添加锁。

BEGIN;
SELECT * from user where id = 2 for update;

在这里插入图片描述
当LOCK_MODE是间隙锁或者Next-key LOCK时,LOCK_DATA代表的就是锁的右边界,锁的左边界就是表中id为5的上一条记录的id值,也就是1,所以本次间隙锁的范围就是(1,5)。当执行INSERT INTOtest.user (id, name, age) VALUES (3, 'zhangsan2', 21); 会获取锁失败,阻塞。

这里由一个疑问就是为什么唯一索引记录不存在的情况下,会从next-key lock退化成间隙锁。
其实这种情况仅靠间隙锁就能解决。幻读的问题。
为什么不可以针对不存在的记录加记录锁,锁是加在索引上的,记录不存在,自然没办法锁住这条不存在的记录。

唯一索引范围查询

针对唯一索引范围查询,会对扫描到的索引加next-key锁

大于或者大于等于的范围查询

情况1:针对大于等于的范围查询,存在等值条件,那么该记录索引中的next-key 退化成记录锁。

BEGIN;
SELECT * from user where id > 15  for update;

在这里插入图片描述
1.首先找到的是id=20这一行,然后对该(15,20] 添加间隙锁。
2.由于是范围查询,innodb存储引擎中,有特殊的记录标识最后一条记录。supremum pseudo-record 所以扫描第二行的时候加的是(20,+8]的next- key
当对 16 17 18 19 20 以及20以上的记录进行删除 更新 插入操作时,会被阻塞。

>=情况

BEGIN;
SELECT * from user where id >= 15  for update;

在这里插入图片描述
从图中可以看到加了三个锁,由于可以定位到id=15这样记录,所以针对ID=15的记录添加的就是记录锁,而接着扫描的就是20这行记录,对(15,20] 加间隙锁,(20,+8)加间隙锁。

从本案例中可以获取当大于等于时,如果有等于就会针对等于的记录加记录锁。

小于或者小于等于的范围查询

BEGIN;
SELECT * from user where id < 6  for update;

在这里插入图片描述

针对「小于或者小于等于」的唯一索引范围查询,如果条件值的记录不在表中,那么不管是「小于」还是「小于等于」的范围查询,扫描到终止范围查询的记录时,该记录中索引的 next-key 锁会退化成间隙锁,其他扫描的记录,则是在这些记录的索引上加 next-key 锁。

< 情况

BEGIN;
SELECT * from user where id < 5  for update;

在这里插入图片描述

非唯一索引等值查询

对非唯一索引进行等值查询的时候,因为存在两个索引,一个是主键索引,一个是二级索引。所以在加锁时,同时对这两个索引都加锁。但是对主键索引加锁的时候,只有满足查询条件的记录才会对主键索引加锁。
非唯一性 二级索引、主键索引都加锁
主键索引查询 只针对主键索引加锁

没有加索引的查询

如果锁定读查询语句,没有使用索引列作为查询条件,或者查询语句没有走索引查询,导致扫描是全表扫描。那么,每一条记录的索引上都会加 next-key 锁,这样就相当于锁住的全表,这时如果其他事务对该表进行增、删、改操作的时候,都会被阻塞。

update和delete语句如果查询条件不加索引,扫描方式也是全表扫描,对每一条记录加next-key 锁,相当于锁住的全表。

BEGIN;
SELECT * from user where name = 'qxlxi'  for update;update user set age = age + 1 WHERE name = 'qxlxi';DELETE FROM user WHERE name = 'qxlxi';select * from performance_schema.data_locks;

在这里插入图片描述

在线上在执行 update、delete、select … for update 等具有加锁性质的语句,一定要检查语句是否走了索引,如果是全表扫描的话,会对每一个索引加 next-key 锁,相当于把整个表锁住了

小结

本篇主要从实操方面介绍是如何针对不同的查询条件进行加锁。当查询条件是主键索引、普通索引 会出现各种不同的情况,但是总体上其实主要解决的就是通过next-key lock、gap lock,record lock,取避免可能出现幻读的情况。

原则 1:加锁的基本单位是 next-key lock,next-key lock 是前开后闭区间。
原则 2:查找过程中访问到的对象才会加锁。
优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。

相关文章:

【MySQL】聊聊唯一索引是如何加锁的

首先我们要明确&#xff0c;加锁的对象是索引&#xff0c;加锁的基本单位是next-key lock&#xff0c;由记录锁和间隙锁组成。next-key是前开后闭区间&#xff0c;间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。 在能使用记录锁或者间隙锁就…...

k8s-CCE使用node节点使用VIP--hostNetworkhostPort

CCE使用node节点使用VIP 背景:想在节点上使用VIP,将nodeport服务做到高可用。启动VIP后发现访问失败 部署 ! Configuration File for keepalived global_defs { router_id master-node }vrrp_instance VI_1 {state BACKUPinterface eth0mcast_src_ip 10.1.0.60virtual_rou…...

18、关于优化中央企业资产评估管理有关事项的通知

一、加强重大资产评估项目管理 (一)中央企业应当对资产评估项目实施分类管理,综合考虑评估目的、评估标的资产规模、评估标的特点等因素,合理确定本集团重大资产评估项目划分标准,原则上,企业对外并购股权项目应纳入重大资产评估项目。中央企业应当研究制定重大资产评估…...

AI大模型日报#0610:港大等1bit大模型“解决AI能源需求”、谷歌开源TimesFM时序预测模型

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…...

速盾:图片cdn加速 免费

随着互联网的快速发展&#xff0c;图片在网页设计和内容传播中起着重要的作用。然而&#xff0c;随着网站访问量的增加和图片文件大小的增加&#xff0c;图片加载速度可能会成为一个问题。为了解决这个问题&#xff0c;许多网站使用图片CDN加速服务。 CDN&#xff08;Content …...

贪心算法例子

贪心算法概述 贪心算法是一种在每一步选择中都做出局部最优选择的算法,以期望通过一系列局部最优选择达到全局最优。贪心算法在许多优化问题中表现良好,特别是在某些特定类型的问题中能够保证找到最优解。 活动选择问题(Activity Selection Problem)背包问题(贪心解法)霍…...

vivado HW_ILA_DATA、HW_PROBE

HW_ILA_DATA 描述 硬件ILA数据对象是ILA调试核心上捕获的数据的存储库 编程到当前硬件设备上。upload_hw_ila_data命令 在从ila调试移动捕获的数据的过程中创建hw_ila_data对象 核心&#xff0c;hw_ila&#xff0c;在物理FPGA上&#xff0c;hw_device。 read_hw_ila_data命令还…...

refault distance算法的一点理解

这个算法看了好几次了&#xff0c;都没太理解&#xff0c;今天记录一下&#xff0c;加深一下印象。 引用某个博客对这个算法的介绍 一次访问page cache称为fault&#xff0c;第二次访问该页面称为refault。page cache页面第一次被踢出LRU链表并回收(eviction)的时刻称为E&#…...

软件安全技术【太原理工大学】

没有划重点&#xff0c;只说了一句课后题和实验中的内容都可能会出。 2022考试题型&#xff1a;选择20个20分&#xff0c;填空10个10分&#xff0c;名词解释4个20分&#xff0c;简答6个30分&#xff0c;分析与论述2个20分&#xff0c;没找到历年题。 如此看来&#xff0c;这门考…...

异常(Exception)

异常是什么 异常就是程序在进行时的不正常行为&#xff0c;就像之前数组时会遇到空指针异常&#xff08;NullPointerException&#xff09;&#xff0c;数组越界异常&#xff08;ArrayIndexOutOfBoundsException&#xff09;等等。 在java中异常由类来表示。 异常的分类 异常…...

一文者懂LLaMA 2(原理、模型、训练)

引言 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是Meta&#xff08;前身为Facebook&#xff09;开发的自然语言处理模型家族之一&#xff0c;LLaMA 2作为其最新版本&#xff0c;展示了在语言理解和生成方面的显著进步。本文将详细解读LLaMA 2的基本原理、模型…...

MySQL 存储函数及调用

1.mysql 存储函数及调用 在MySQL中&#xff0c;存储函数&#xff08;Stored Function&#xff09;是一种在数据库中定义的特殊类型的函数&#xff0c;它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑&#xff0c;使得在应用程序中调用时更加简单…...

设计模式七大原则-单一职责原则SingleResponsibility

七大原则是在设计“设计模式”的时候需要用到的原则&#xff0c;它们的存在是为了保证设计模式达到以下几种目的&#xff1a; 1.代码重用性 2.可读性 3.可拓展性 4.可靠性&#xff08;增加新的功能后&#xff0c;对原来的功能没有影响&#xff09; 5.使程序呈现高内聚、低耦合的…...

msfconsole利用Windows server2008cve-2019-0708漏洞入侵

一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services&#xff08;远程桌面服务&#xff09;&#xff08;端口3389&#xff09;中&#xff0c;未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞&#xff0c;可能导致远程无需用户验…...

Reinforcement Learning学习(三)

前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…...

hw meta10 adb back up DCIM

1. centos install adb 2. HW enable devlepment mode & enalbe adb debug 3. add shell root/zt/adb-sync python3 ./adb-sync --reverse /sdcard/DCIM/Camera /root/zt/meta10...

Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)

上期链接&#xff1a;Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算&#xff0c;我们先给人物和野猪挂上属性和攻击属性的代码&#xff0c;然后通过触发器触发受伤的事件。物体&#xff08;人物也好敌人也行&#xff…...

从河流到空气,BL340工控机助力全面环保监测网络构建

在环保监测领域&#xff0c;智能化、高效率的监测手段正逐步成为守护绿水青山的新常态。其中&#xff0c;ARMxy工业计算机BL340凭借其强大的处理能力、高度的灵活性以及广泛的兼容性&#xff0c;在水质监测站、空气质量检测、噪音污染监控等多个环保应用场景中脱颖而出&#xf…...

零拷贝技术

背景 磁盘可以说是计算机系统重最慢的硬件之一&#xff0c;读写速度相对内存10以上&#xff0c;所以针对优化磁盘的技术非常的多&#xff0c;比如&#xff1a;零拷贝、直接I/O、异步I/O等等&#xff0c;这些优化的目的就是为了提高系统的吞吐量&#xff0c;另外操作系统内核中的…...

Flutter_Android上架GooglePlay_问题

上架GooglePlay权限问题 问题描述 REQUEST_INSTALL_PACKAGES 权限问题解决方式 方式1 找到所有使用该权限的库修改删除该权限引用 方式2 打开项目 ~/andoird/app/src/main/AndroidMainfest.xml 添加文本<uses-permission android:name"android.permission.REQUES…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...