Mysql锁及行锁机制探索

news2024/12/23 22:56:16

先讲一下mysql存储方式(innodb)

分为,聚簇索引和非聚簇索引。

聚簇索引,就是b+树的所有真实数据。

聚簇索引不是一种索引类型,而是一种数据存储方式。innoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时,它的行数据实际上存放在索引的叶子页中,因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。

插入操作时

每向表中插入一条记录,本质上就是向该表的[聚簇索引]以及所有二级索引代表的 B+ 树的节点中插入数据。

非聚簇索引,

就是b+树的所有带 主键的索引数据。

一、mysql锁介绍

详细文件

mysql锁原图官网地址:

MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking

二、mysql行锁机制

行级锁实际上是索引记录锁

2.1、示例数据如下

-- db01.user definition CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT, name varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, age int NOT NULL, no int NOT NULL COMMENT '编号', PRIMARY KEY (id), UNIQUE KEY user_un (no), KEY user_age_IDX (age) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; INSERT INTO db01.user (id, name, age, no) VALUES(0, '石昊', 0, 0); INSERT INTO db01.user (id, name, age, no) VALUES(5, '王林', 60, 50); INSERT INTO db01.user (id, name, age, no) VALUES(10, '叶凡', 70, 100); INSERT INTO db01.user (id, name, age, no) VALUES(15, '罗峰', 80, 110); INSERT INTO db01.user (id, name, age, no) VALUES(20, '萧炎', 100, 120); INSERT INTO db01.user (id, name, age, no) VALUES(25, '唐三', 130, 150);

2.2、主键索引 id

id 为 [0,5,10,15,20,25]

随时查询 锁情况 select * from performance_schema.data_locks

2.2.1 行锁 主键等值查询 —— 数据存在

select * from user where id = 10 for update;

2.2.2 间隙锁

2.2.2.1 间隙锁 主键等值查询 —— 数据不存在

select * from user where id = 11 for update;

这个在操作11,但是没有这个id=11的数据,避免其他事务冲突。

会去先加nextKey-Lock,(10,15],但是因为是等值查询,不需要锁15,所以会退化成间隙锁。

(10,15):10不需要锁,15也不需要锁,锁的是中间这些区间,所以是间隙锁。

tips 官网原话

默认情况下,在事务隔离级别InnoDB下运行 。

REPEATABLE READ在这种情况下,InnoDB使用下一键锁进行搜索和索引扫描,这可以防止幻像行(请参阅

第 15.7.4 节 “幻像行”)。为了防止幻像,请使用一种称为下一个键锁定的InnoDB算法,该算法将索引行锁定与间隙锁定相结合。 执行行级锁定的方式是,当它搜索或扫描表索引时,它会在遇到的索引记录上设置共享锁或独占锁。因此,行级锁实际上是索引记录锁。另外,索引记录上的下一键锁也会影响 索引记录之前的“间隙” 。也就是说,下一个键锁是索引记录锁加上索引记录之前间隙上的间隙锁。如果一个会话在记录上有共享锁或独占锁InnoDB`

R`R在一个索引中,另一个会话不能在索引顺序 之前的间隙中插入新的索引记录 。

MySQL 评估WHERE条件后,将释放不匹配行的记录锁。对于 UPDATE语句,InnoDB 是否进行“半一致”读取,从而将最新提交的版本返回给 MySQL,以便 MySQL 可以确定该行是否WHERE 符合UPDATE.

2.2.2.2 间隙锁 (当做问题)

select * from t where id >= 10 and id < 11 for update;

结果:

分析:

2.2.3 临键锁 主键范围查询

select * from user where id >= 10 for update;

2.3、非主键唯一索引

no 是唯一索引:[0,50,100,110,120,150]

2.3.1 行锁 唯一索引等值查询 —— 数据存在

select * from user where no = 100 for update;

问题:

select id from t where no = 100 for update;

会有变化吗? 答案是没有。

2.3.2 间隙锁 唯一索引等值查询 —— 数据不存在

select * from user where no = 111 for update;

非主键索引等值查询,数据不存在,相当于一个范围查询,仅仅会在非主键索引上加锁,加的还是间隙锁,左开右开区间;

2.3.3 临键锁 唯一索引返回查询

select * from user where no >= 110 and no < 115 for update;

  1. 120的临建锁(110,120] 110的临建锁(100,110] ,合并为(100,120]
  2. 对应的主键索引 15 也会加锁!

2.4、普通索引

age是普通索引。数据如下

[0,60,70,80,100,130]

2.4.1 行锁 普通索引等值查询 —— 数据存在

select * from user where age = 100 for update;

如果是:

select id from t where age = 100 for update; 效果一样

2.4.2 间隙锁

select * from user where age = 101 for update;

2.4.3 临键锁

select * from user where age > 70 and age <= 85 for update;

2.5、普通字段

对普通字段而言,无论是哪个查询,都需要扫描全部记录,所以这个锁直接加在了主键上,并且是锁住全部的区间。

begin; select * from user u where name = '石昊' for update commit; select id from user u where name = '石昊' for update; 也是一样。相当于一个事务。但是没有索引

总结

如果规律记不住,可以直接通过分析 data_locks 的信息,进行判断加锁范围。

select * from performance_schema.data_locks;

LOCK_MODE

LOCK_DATA

锁范围

X,REC_NOT_GAP

15

15 那条数据的行锁

X,GAP

15

15 那条数据之前的间隙,不包含 15

X

15

15 那条数据的间隙,包含 15

  1. LOCK_MODE = X
  2. X,GAP
  3. X,REC_NOT_GAP

三、思考:

问题1:

针对id [0,5,10,15,20,25]

select * from user where id >= 10 and id < 11 for update;会生成什么样的锁。

结果:

分析:

问题2:

select id from user where no = 100 for share;

执行以下语句会怎么样:

update t set age = 1000 where id = 10; update t set no = 1101 where id = 10; update t set name = '小舞' where no = 100;

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

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

相关文章

PlumeLog查不到日志

一 问题&#xff1a; PlumeLog查不到日志&#xff0c;记录遇到的情况 二 场景 1. 输入不全

5款轻量级小软件,突出一个简洁轻便

​ 今天的主题是简洁&#xff0c;轻便&#xff0c;都是轻量级的小软件&#xff0c;界面都是非常简洁&#xff0c;而且无广告的。 1.图形设计——Affinity Designer ​ Affinity Designer是一款获奖的矢量图形软件&#xff0c;它设定了设计界的新标准。它适用于Windows, macOS…

FANUC机器人电气控制柜内部硬件电路和模块详细介绍

FANUC机器人电气控制柜内部硬件电路和模块详细介绍 PSU电源单元 通过背板传输了如下电源 +5 +2.0V +3.3 +24v +24E +15V -15V 主板--接口描述: 主板内部结构: 面板电路板: 引申一下 KM21 与 KM22 的作用它们分别接至操作面板上上的急停按

c++入门一

参考&#xff1a;https://www.learncpp.com/cpp-tutorial/ When you finish, you will not only know how to program in C, you will know how NOT to program in C, which is arguably as important. Tired or unhappy programmers make mistakes, and debugging code tends…

详解mysql事务,事务并发安全问题的复现以及大事务的优化

好文推荐&#xff1a; 2.5万字详解23种设计模式 springboot 实现延时队列&#xff08;超级实用&#xff09; 2.5万字讲解DDD领域驱动设计 文章目录 1. 事务定义2. 事务特性&#xff08;ACID&#xff09;3. 事务并发问题4. 事务隔离级别5. 基础命令6. 脏读复现7. 不可重复读复现…

滑动窗口实例5(水果成篮)

题目&#xff1a; 你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按…

qt相关的demo集合

自己写过的qt/c相关程序的demo集合 &#xff08;许多学习自网络中&#xff0c;很感谢大家的分享&#xff09; 源码地址&#xff1a;Qt与学习通页面: 记录与Qt相关的代码 - Gitee.com 源码目录: echart简单应用 opencv图像处理 QSetting简单使用 QtAv播放视频 ui页面 表情 超星…

Vue框架--Vue中的数据代理

下面,我们一起来说以下Vue中的数据代理。 1.Object.defineProperty()方法回顾 * Object.defineProperty()方法基本配置项 * value:指定设置对象内容的属性值 * enumerable:true, //控制属性是否可以枚举(也就是是否可以被遍历),默认值是false * writable:true, //控制属性是…

苹果将在iPhone16系列中引入微透镜阵列技术,亮度更高、功耗更低

根据韩国媒体The Elec的报道&#xff0c;苹果公司正与其主要供应商三星和LG展开合作&#xff0c;以评估并衡量是否有必要在明年的iPhone 16系列中引入微透镜&#xff08;micro-lens&#xff09;技术来升级屏幕。 这项方案集中在OLED屏幕架构上&#xff0c;计划采用微透镜阵列&…

20用于深度学习训练和研究的数据集

数据集在计算机科学和数据科学中发挥着至关重要的作用。它们用于训练和评估机器学习模型&#xff0c;研究和开发新算法&#xff0c;改进数据质量&#xff0c;解决实际问题&#xff0c;推动科学研究&#xff0c;支持数据可视化&#xff0c;以及决策制定。数据集提供了丰富的信息…

13 mysql date/time/datetime/year 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 datetime/date/time/year 类类型…

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器

一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中&#xff0c;我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说&#xff0c;RNN方法已经过时了&#xff0c;研究它们是没有意义的。的…

如何增强客户支持?用全渠道聊天机器人

您的用户在哪里&#xff1f;您是否想拥有源源不断的客户&#xff1f;全渠道聊天机器人可确保您在他们需要的地方为他们提供一致的客户支持&#xff01; 自技术出现以来&#xff0c;消费者行为已经完全改变。这意味着企业与用户互动和提供客户支持的方式也发生了变化。现在&…

Spring 系统架构

Spring总共大约有 20个模块&#xff0c;由1300多个不同的文件构成。而这些组件被分别整合在核心容器&#xff08;CoreContainer&#xff09;、AOP&#xff08;Aspect Oriented Programming&#xff09;和设备支持&#xff08;Instrmentation&#xff09;、数据访问及集成&#…

文心一言放出的“时代礼物”,藏着中国科技的黄金机会

8月31日&#xff0c;第一批国产大模型通过了“生成式人工智能备案”&#xff0c;可以开放公众服务。 一石激起千层浪&#xff0c;对AIGC强烈好奇&#xff0c;为国产应用疯狂打call&#xff0c;文心一言对话刷屏朋友圈&#xff0c;普通人和科技圈都嗨翻了。 不到24小时&#xff…

硬件SPI口扩展

在工控板设计中&#xff0c;经常会遇到扩展IO。具有相同的功能电路板接口相同&#xff0c;所以很容易采用排线方式连接到CPU主控板上&#xff0c;这种排线连接&#xff0c;我称之为总线。 现在的CPU引脚多&#xff0c;不扩展IO&#xff0c;使用模拟SPI&#xff0c;也可以实现&…

【力扣每日一题】2023.9.2 最多可以摧毁的敌人城堡数量

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题难在阅读理解&#xff0c;题目看得我匪夷所思&#xff0c;错了好多个测试用例才明白题目说的是什么。 我简单翻译一下就是寻找1和…

15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized

Synchronized 本篇文章将围绕synchronized关键字&#xff0c;使用大量图片、案例深入浅出的描述CAS、synchronized Java层面和C层面的实现、锁升级的原理、源码等 大概观看时间17分钟 可以带着几个问题去查看本文&#xff0c;如果认真看完&#xff0c;问题都会迎刃而解&…

03_nodjs_npm的使用

03 【npm的使用】 1.包和npm 1.1 什么是包 由于 Node 是一套轻内核的平台&#xff0c;虽然提供了一系列的内置模块&#xff0c;但是不足以满足开发者的需求&#xff0c;于是乎出现了包&#xff08;package&#xff09;的概念&#xff1a; 与核心模块类似&#xff0c;就是将一…

[学习笔记]斜率优化dp 总结

前言&#xff1a; 我们学过不少优化类的算法了&#xff0c;大部分都是基于凸函数的性质给出的优化&#xff0c;比如Slope Trick&#xff0c;Wqs二分&#xff0c;又比如今天的斜率优化&#xff08;不知道什么时候会有空把Slope Trick写掉&#xff09; 正文&#xff1a; 我们考…