【MySQL进阶之路】MySQL中到底为什么会出现幻读?

news2024/12/26 21:59:52

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!
在这里插入图片描述
在可重复读隔离级别中,通过 临键锁 在一定程度上缓解了幻读的问题,但是在特殊情况下,还是会出现幻读

以下两种情况下,会出现 幻读,大家可以先看一下如何出现的幻读, 思考一下为什么会出现幻读 ,答案会写在后边!

  • 情况1:事务 A 通过更新操作获取最新视图之后,可以读取到事务 B 提交的数据,出现幻读现象

对于下图中的执行顺序,会出现幻读现象,可以看到在事务 A 执行到第 7 行发现查询到了事务 B 新提交的数据了

这里都假设使用的 InnoDB 存储引擎,事务隔离级别默认都是 可重复读

在可重复读隔离级别下,使用了 MVCC 机制,select 操作并不会更新版本号,是快照读(历史版本),执行 insert、update 和 delete 时会更新版本号,是当前读(当前版本),因此在事务 A 执行了第 6 行的 update 操作之后,更新了版本号,读到了 id = 5 这一行数据的最新版本,因此出现了幻读!

1705415508036

  • 情况2:事务 A 在步骤 2 执行的读操作并不会生成间隙锁,因此事务 B 会在事务 A 的查询范围内插入行

对于下边这种情况也会出现幻读,在第 6 行使用 select ... for update 进行查询,这个查询语句是当前读(查询的最新版本),因此查询到了事务 B 新提交的数据,出现了幻读!

1705415928868

那么对于以上两种情况来说,为什么会出现幻读呢?

对于事务 A 出现了幻读,原因就是,事务 A 执行的第 2 行是普通的 select 查询,这个普通的 select 查询是快照读,不会生成临键锁(具体生成临键锁、记录锁还是间隙锁根据 where 条件的不同来选择),因此就 不会锁住这个快照读所覆盖的记录行以及区间

那么事务 B 去执行插入操作,发现并没有生成临键锁,因此直接可以插入成功

重要:那么我们从代码层面尽量去避免幻读问题呢?

在一个事务开始的时候,尽量先去执行 select ... for update,执行这个当前读的操作,会先去生成临键锁,锁住查询记录的区间,不会让其他事务插入新的数据,因此就不会产生幻读

这里我也画了一张图如下,你也可以去启动两个会话窗口,连接上 mysql 执行一下试试,就可以发现,当事务 A 执行 select ... for update 操作之后,就会加上临键锁(由于 where 后的条件是 id=5,因此这个临键锁其实会退化为记录锁,将 id=5 这一行的数据锁起来),那么事务 B 再去插入 id=5 这条数据,就会因为有锁的存在,阻塞插入语句

1705416690115

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

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

相关文章

第六篇【传奇开心果系列】Python微项目技术点案例示例:庖丁解牛tkinter.ttk库gui界面编程

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录前言一、主窗口和子窗口创建和切换,以员工信息管理系统示例代码二、主窗口添加有菜单项图标的菜单栏、工具栏和右键菜单示例代码三、使用sqlite3数据库增删改查管理员工信息示例代码四、在主…

从物联网到数字孪生:智慧社区的演变

随着科技的飞速发展和数字化转型的深入推进,智慧社区已成为提升城市治理水平和居民生活质量的重要方向。在这一演变过程中,物联网和数字孪生技术起到了至关重要的作用。本文将深入探讨从物联网到数字孪生的演变过程,分析这一转变对智慧社区建…

FL Studio 21中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件,没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本,熟悉了新版本一些好用的操作,Fl Studio就又推出了更新的版本,而且F…

基于springboot大学生租房系统源码和论文

伴随着全球信息化发展,行行业业都与计算机技术相衔接,计算机技术普遍运用于各大行业,大学生租房系统便是其中一种。实施计算机系统来管理可以降低大学生租房管理的成本,使整个大学生租房的发展和服务水平有显著提升。 本论文主要面…

知识图谱:py2neo导入周杰伦歌单csv文件

文章目录 py2neo导入csv文件py2neo导入周杰伦歌单csv效果展示 py2neo导入csv文件 之前写的知识图谱指南 知识图谱:py2neo将csv文件导入neo4j 因为没有区分不同实体entity的类型,所以颜色相同,无法相互区分歌手、歌曲还是专辑等等。 py2ne…

解决STM32MP157开发板密码登录问题

开发板密码登录问题是很多人遇到的问题,网上有很多帖子,我也参考过,不太适用,很复杂,甚至会被误导,我差点连ubuntu虚拟机都无法登录了。有的密码匹配,有的取消不了密码。 1、密码配置&#xff…

恒流模块与常用电容

户外电源电芯:DJ采用无热中心设计:每个电芯都有一部分裸露在外面,保证良好散热上 固态电容相较于普通电解电容具有更高的电气性能、更长的使用寿命和更稳定的温度特性,但成本也相对较高。固态电容在1块左右,电解电容在…

import tensorflow_hub报错

问题: 导入tensorflow_hub报ModuleNotFoundError: No module named ‘tensorflow.python.checkpoint’ 解决: tensorflow-estimator版本不对 和tensorflow(2.6.0)版本一致 。 pip install -U tensorflow-estimator2.6.0 验证&a…

无线充电 线圈设计

本文所讨论参数,均有论文,仿真和实测支撑,也欢迎感兴趣的小伙伴一起讨论。 有个笑话,说是18年无线充白牌热销的时段,单片机没赚到钱,壳料没赚到钱,pcba也没赚到钱,钱都被卖NP0电容和…

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java)

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java) 比赛链接:Codeforces Round 926 (Div. 2) B题传送门:B. Sasha and the Drawing 题目:B. Sasha and the Drawing Example input 3 4 3 3 3 10 3 9 4 7 7 11 2 3output 2 …

挑战杯 YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快,YOLOv6还没用熟YOLOv7就来了,如果有同学的毕设项目想用上最新的技术,不妨看看学长的这篇文章,学长带大家简单的…

JavaWeb-JDBC-API详解

一、JDBC介绍 二、JDBC 快速入门 package com.itheima.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class JDCBDemo {public static void main(String[] args) throws Exception {//1、注册驱动Class.forName("co…

微信小程序: 获取accessToken,手机号, 小程序二维码,openId与unionId 公共配置类(核心篇)

全文目录,一步到位 1.前言简介1.1 专栏传送门 2. 微信小程序公用功能2.1 配置准备工作2.1.1 配置文件准备(单体放yml中 微服务放配置中心)2.1.2 获取配置文件中的小程序配置2.1.3 设置redis配置 2.2 创建不同功能工具类2.2.1 创建微信服务工具类WechatServiceUtils2.2.2 创建Re…

在windows上安装好anaconda后,输入conda命令出现 OSError: [WinError 123] 文件名、目录名或卷标语法不正确。

下载anaconda后使用conda命令就会报错,重装几次后无效。于是潜心解决发现问题: 报错: OSError: [WinError 123] 文件名、目录名或卷标语法不正确。 在这里是路径无效,“.”应该是“:”本身没有问题。路径的错误在意…

Java集合 List接口

List接口操作 Java的List接口是Java集合框架中的一部分&#xff0c;它表示有序的集合。List接口提供了许多常用的方法&#xff0c;以下是其中的一些例子&#xff1a; 增加元素 add(E e)&#xff1a;将指定的元素插入此列表的末尾。 List<String> list new ArrayList…

linux kernel 内存踩踏之KASAN_SW_TAGS(二)

一、背景 linux kernel 内存踩踏之KASAN&#xff08;一&#xff09;_kasan版本跟hasan版本区别-CSDN博客 上一篇简单介绍了标准版本的KASAN使用方法和实现&#xff0c;这里将介绍KASAN_SW_TAGS和KASAN_HW_TAGS 的使用和背后基本原理&#xff0c;下图是三种方式的对比&#x…

C++11---(1)

目录 一、C11简介 二、列表初始化 2.1、{ } 初始化 三、变量类型推导 3.1、auto 3.2、decltype 为什么需要decltype 四、final和override 4.1、final 4.2、override 五、默认成员函数控制 5.1、default修饰函数 5.2、delete修饰函数 六、nullptr 一、C11简介 C11是…

JavaScript_00001_00000

contents 简介变量与数据类型自动类型转换强制类型转换 简介 变量与数据类型 根据变量定义的范围不同&#xff0c;变量有全局变量和局部变量之分。直接定义的变量是全局变量&#xff0c;全局变量可以被所有的脚本访问&#xff1b;在函数里定义的变量称为局部变量&#xff0c;…

17-k8s控制器资源-job控制

job控制器&#xff1a;就是一次性任务的pod控制器&#xff0c;pod完成作业后不会重启&#xff0c;其重启策略是&#xff1a;Never 1&#xff0c;job控制器案例描述 启动一个pod&#xff0c;执行完成一个事件&#xff0c;然后pod关闭&#xff1b; 事件&#xff1a;计算π的值&a…

【初始RabbitMQ】工作队列的实现

工作队列 工作队列&#xff08;又称为任务队列&#xff09;的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程…