MySQL可重复读的隔离机制下是否彻底解决了幻读?

news2024/9/19 9:52:47

答案:没有彻底解决。

一、什么是幻读?

当同一个查询在不同时间产生不同的结果集时,事务中就会出现幻读问题。

幻读关注的是记录数量的不同。
不可重复读关注的是记录内容的不同。

二、快照读和当前读

InnoDB引擎的默认隔离级别是可重复读,它在很大程度上避免了幻读现象。两种场景下的解决方案:

  1. 针对快照读:通过MVCC解决幻读。在可重复读的隔离级别下,事务执行中看到的数据,和该事务启动时第一个查询语句看到的数据是一致的。即使中途有其他事务插入数据,当前事务也是无法查询到的。
  2. 针对当前读:通过next-key lock(记录锁+间隙锁)的方式解决了幻读。因为执行select … for update语句时,会加上next-key lock,如果有其他事务在next-key lock锁的范围内插入一条记录,那么这个插入语句会被堵塞。

三、什么情况下仍会出现幻读?

  1. 快照读
    在这里插入图片描述
    在可重复读隔离级别下,事务 A 第一次执行普通的 select 语句时生成了一个 ReadView,之后事务 B 向表中新插入了一条 id = 5 的记录并提交。接着,事务 A 对 id = 5 这条记录进行了更新操作,在这个时刻,这条新记录的 trx_id 隐藏列的值就变成了事务 A 的事务 id,之后事务 A 再使用普通 select 语句去查询这条记录时就可以看到这条记录了,于是就发生了幻读。

因为这种特殊现象的存在,所以我们认为 MySQL Innodb 中的 MVCC 并不能完全避免幻读现象。

  1. 当前读
    T1 时刻:事务 A 先执行「快照读语句」:select * from t_test where id > 100 得到了 3 条记录。
    T2 时刻:事务 B 往插入一个 id= 200 的记录并提交;
    T3 时刻:事务 A 再执行「当前读语句」 select * from t_test where id > 100 for update 就会得到 4 条记录,此时也发生了幻读现象。

要避免这类特殊场景下发生幻读的现象的话,就是尽量在开启事务之后,马上执行 select … for update 这类当前读的语句,因为它会对记录加 next-key lock,从而避免其他事务插入一条新记录。

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

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

相关文章

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址,再加上--port --8080 就可以将端口号修改为8080(修改后边的数字就可以修改为你想要的端口号)

pytorch-训练自定义数据集实战

目录 1. 步骤2. 加载数据2.1 继承Dataset2.1.1 生成name2label2.1.2 生成image path, label的文件2.1.3 __len__2.1.3 __getitem__2.1.4 数据切分为train、val、test 3. 建立模型4. 训练和测试4. 完整代码 1. 步骤 加载数据创建模型训练和测试迁移学习 2. 加载数据 这里以宝…

打造创新项目:从理念到市场的成功之路

打造创新项目:从理念到市场的成功之路 前言为何创新?如何创新?创新的意义 一、深入市场,洞察行业脉搏二、精准定位,锁定目标市场三、全面评估,确保项目可行性四、创新引领,打造独特卖点五、开放…

二叉树_堆(下卷)

前言 接前面两篇的内容,接着往下讲二叉树_堆相关的内容。 正文 那么,回到冒泡排序与堆排序的比较。 我们知道冒泡排序的时间复杂度为 O ( N 2 ) O(N^2) O(N2),这个效率是不太好的。 那么,我们的堆排序的时间复杂度如何呢&…

Linux:进程概述(什么是进程、进程控制块PCB、并发与并行、进程的状态、进程的相关命令)

进程概述 (1)What(什么是进程) 程序:磁盘上的可执行文件,它占用磁盘、是一个静态概念 进程:程序执行之后的状态,占用CPU和内存,是一个动态概念;每一个进程都有一个对应的进程控制块…

云计算复习--分布式存储系统

分布式存储 分布式存储系统是一种将数据分散在多个独立节点上,并通过网络进行数据传输和访问的存储系统 分布式存储的特点:可扩展性、高可用性、容错性、高性能等。分布式存储系统能够水平扩展存储容量和性能,提供持续可用的数据存储服务&am…

【在开发小程序的时候如何排查问题】

在开发小程序的时候如何排查问题 在最近开发小程序的时候,经常出现本地在浏览器中调试没有问题,但是一发布到预发环境就出现各种个样的问题 手机兼用性问题 有时候会出现苹果🍎手机键盘弹出,导致ui界面高度出现异常边界问题&#…

for循环打印1~10之间数字

对于for循环之前了解不够的同学可以看之前的我写的介绍 我们这里直接上代码 #include<stdio.h> int main() {int i 0;for (i 1; i < 11; i){printf("%d\n", i);}return 0; }

0724_驱动1 字符设备驱动内部实现

一、字符设备驱动内部实现工作原理 二、分布实现字符设备驱动API接口 分配对象&#xff1a; #include <linux/cdev.h> struct cdev *cdev_alloc(void) 函数功能&#xff1a;分配对象struct cdev *结构体指针 参数&#xff1a;无 返回值&#xff1a;成功返回struct cdev *…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等&#xff0c;后面的几个专业是计算机科学与技术的重要分支&#xff0c;而这个门类的其他分支并没有单列出来一个本科专业&#xff0…

实战|EDU挖掘记录-某学校sql注入挖掘记录

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路尽在无问社区http://www.wwlib.cn/index.php/artread/artid/9755.html 某大学的办公系统&#xff0c;学号是我从官网下载的优秀人员名单找到的&#xff0c;初始密码为姓名首字母加身份证后六位&#xff0c;我是社…

高级及架构师高频面试题-基础型

1、设计模式有哪些原则&#xff08;待解释的更直白&#xff09; 单一职责原则&#xff1a;一个类或方法应只负责一项职责&#xff0c;避免一个类因为多个变化原因而改变。开闭原则&#xff1a;软件实体应对扩展开放&#xff0c;对修改封闭。比如要增加用户类别的时候可以新增一…

Java高频面试题分享

文章目录 1. 策略模式怎么控制策略的选取1.1 追问&#xff1a;如果有100种策略呢&#xff1f;1.2 追问&#xff1a;什么情况下初始化Map 2. 什么是索引&#xff1f;什么时候用索引&#xff1f;2.1 追问&#xff1a;怎么判断系统什么时候用量比较少2.2 追问&#xff1a;如何实时…

树 ----- 基础学习

树 树&#xff1a;n&#xff08;n>0&#xff09;个结点的有限集合。n 0 ,空树。 在任意一个非空树中&#xff0c; 1&#xff0c;有且仅有一个特定的根结点 2&#xff0c;当n>1 时&#xff0c;其余结点可分为m个互不相交的有限集合T1,T2,T3.。。。。Tm&#xff0c;其中每…

使用 uPlot 在 Vue 中创建交互式图表

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 uPlot 在 Vue 中创建交互式图表 应用场景介绍 uPlot 是一个轻量级、高性能的图表库&#xff0c;适用于创建各种交互式图表。它具有丰富的功能&#xff0c;包括可自定义的轴、网格、刻度和交互性。本篇博…

脊髓损伤的小伙伴锻炼贴士

Hey小伙伴们~&#x1f44b; 今天要跟大家聊一个超燃又超温馨的话题&#xff01;&#x1f31f; 对于我们脊髓损伤的小伙伴们来说&#xff0c;保持身体活力&#xff0c;不仅是健康的小秘诀&#xff0c;更是拥抱美好生活的超能量哦&#xff01;&#x1f4aa; #脊髓损伤# 首先&…

【ffmpeg命令入门】Nginx的安装与制作HLS流媒体服务器

文章目录 前言Nginx简介Ubuntu安装Nginxffmpeg生成HLS流媒体1. 生成HLS流媒体命令说明 配置Nginxffplay播放m3u8 总结 前言 在数字内容传输和流媒体服务中&#xff0c;HLS&#xff08;HTTP Live Streaming&#xff09;已经成为一种流行的解决方案&#xff0c;特别是在视频直播…

FPGA FIFO IP核(2)- 配置与调用

前言 上上期介绍了FIFO IP核理论方面的一些内容&#xff0c;接下来开始进行FIFO IP核的配置和使用部分。 FIFO IP核再理解 关键点 先进先出&#xff1a;数据按顺序写入FIFO&#xff0c;先被写入的数据在读取的时候先被读出。 FIFO存储器没有地址线。 FIFO主要作为缓存&#…

C语言 | Leetcode C语言题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; int hIndex(int* citations, int citationsSize) {int left 0, right citationsSize - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > citationsSize - mid) {right mid - 1;} else {left mi…

时效性知识点是否值得花时间学习和研究

新趋势 智能大模型训练成本与人才培养成本之间的博弈。 视频 录了个断断续续的视频&#xff1a; 编程简单吗&#xff1f;为什么技术型内容几乎停更了&#xff1f; 代码形式的程序 /** Created by ArduinoGetStarted.com** This example code is in the public domain** Tuto…