(四十二)MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的?

2023-11-11

今天来接着给大家讲解,MySQL中最牛的RR隔离级别,是如何同时避免不可重复读问题和幻读问题的。

其实大家现在应该都知道,在MySQL中让多个事务并发运行的时候能够互相隔离,避免同时读写一条数据的时候有影响,是依托undo log版本链条和ReadView机制来实现的。

上次我们都讲过了,基于ReadView机制可以实现RC隔离级别,即你每次查询的时候都生成一个ReadView,这样的话,只要在你这次查询之前有别的事务提交了,那么别的事务更新的数据,你是可以看到的。

那么如果是RR级别呢?RR级别下,你这个事务读一条数据,无论读多少次,都是一个值,别的事务修改数据之后哪怕提交了,你也是看不到人家修改的值的,这就避免了不可重复读的问题。

同时如果别的事务插入了一些新的数据,你也是读不到的,这样你就可以避免幻读的问题。

那么到底是如何实现的呢?我们今天来看看。

首先我们还是假设有一条数据是事务id=5的一个事务插入的,同时此时有事务A和事务B同时在运行,事务A的id是60,事务B的id是70,如下图所示。

image-20230108130038403

这个时候,事务A发起了一个查询,他就是第一次查询就会生成一个ReadView,此时ReadView里的creator_trx_id是60,min_trx_id是60,max_trx_id是71,m_ids是[60, 70],此时ReadView如下图所示。

image-20230108130057346

这个时候事务A基于这个ReadView去查这条数据,会发现这条数据的trx_id为50,是小于ReadView里的min_trx_id的,说明他发起查询之前,早就有事务插入这条数据还提交了,所以此时可以查到这条原始值的,如下图。

image-20230108130134112

接着就是事务B此时更新了这条数据的值为值B,此时会修改trx_id为70,同时生成一个undo log,而且关键是事务B此时他还提交了,也就是说此时事务B已经结束了,如下图所示。

image-20230108130206574

这个时候大家思考一个问题,ReadView中的m_ids此时还会是60和70吗?

那必然是的,因为ReadView一旦生成了就不会改变了,这个时候虽然事务B已经结束了,但是事务A的ReadView里,还是会有60和70两个事务id。

他的意思其实就是,在你事务A开启查询的时候,事务B当时是在运行的,就是这个意思。

那么好,接着此时事务A去查询这条数据的值,他会惊讶的发现此时数据的trx_id是70了,70一方面是在ReadView的min_trx_id和max_trx_id的范围区间的,同时还在m_ids列表中

这说明什么?

说明起码是事务A开启查询的时候,id为70的这个事务B还是在运行的,然后由这个事务B更新了这条数据,所以此时事务A是不能查询到事务B更新的这个值的,因此这个时候继续顺着指针往历史版本链条上去找,如下图。

image-20230108130244565

接着事务A顺着指针找到下面一条数据,trx_id为50,是小于ReadView的min_trx_id的,说明在他开启查询之前,就已经提交了这个事务了,所以事务A是可以查询到这个值的,此时事务A查到的是原始值,如下图。

image-20230108130319055

大家看到这里有什么感想?是不是感觉到这一下子就避免了不可重复读的问题?

你事务A多次读同一个数据,每次读到的都是一样的值,除非是他自己修改了值,否则读到的一直会一样的值。

不管别的事务如何修改数据,事务A的ReadView始终是不变的,他基于这个ReadView始终看到的值是一样的!

接着我们来看看幻读的问题他是如何解决的。假设现在事务A先用select * from x where id>10来查询,此时可能查到的就是一条数据,而且读到的是这条数据的原始值的那个版本,至于原因,上面都解释过了,如下图。

image-20230108130408084

现在有一个事务C插入了一条数据,然后提交了,此时如下图所示。

image-20230108130439702

接着,此时事务A再次查询,此时会发现符合条件的有2条数据,一条是原始值那个数据,一条是事务C插入的那条数据,但是事务C插入的那条数据的trx_id是80,这个80是大于自己的ReadView的max_trx_id的,说明是自己发起查询之后,这个事务才启动的,所以此时这条数据是不能查询的。

因此事务A本次查询,还是只能查到原始值一条数据,如下图。

image-20230108130526163

所以大家可以看到,在这里,事务A根本不会发生幻读,他根据条件范围查询的时候,每次读到的数据都是一样的,不会读到人家插入进去的数据,这都是依托ReadView机制实现的!

好了,到此为止,如何基于ReadView机制实现RR隔离级别,避免不可重复读问题和幻读问题,就全部讲解清楚了,下次我们来做一个多事务并发隔离机制的总结。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(四十二)MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的? 的相关文章

  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 如何在 Spring 中禁用使用 @Component 注释创建 bean?

    我的项目中有一些用于重构逻辑的通用接口 它看起来大约是这样的 public interface RefactorAwareEntryPoint default boolean doRefactor if EventLogService wa
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v
  • 通过触发器应用表的列权限

    现在 我有一个名为 Members 的表 其中包含内容 分为联系人数据 银行数据 现在 管理员应该能够创建 更新 删除用户 这些用户保存在另一个表中 该表只能访问管理员 用户应该获得自己的 mysql 用户帐户 管理员还应该能够设置权限 例
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • MySQL开机无法启动,需手动启动才可以。

    环境 Window10 戴尔笔记本 问题 每次机器重启 MySQL的服务都没有开起来 查看服务 确认已将MySQL的服务设为自动启动 原因 Windows服务管理器对所有服务的状态进行管控 服务管理器会等待服务就绪 这个时间默认为60秒 然
  • c#二值化特征相关提取

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Ope
  • 编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

    最近在研究Python和Erlang 反复提到动态类型语言 动态语言 解释型语言这些概念 这些概念很生涩 在这里做一个总结 编译型语言和解释型语言 1 编译型语言 需通过编译器 compiler 将源代码编译成机器码 之后才能执行的语言 一
  • C# vs2012中 -- 不可访问,因为它受保护级别限制

    最近开始学习 C 现在再学习里面的迭代器 在网上找了个例子 但是弄来有问题 在 class IterationSampleEnumerator 里面的values和startingPrint 会提示不可访问 因为它受保护级别限制问题代码 u
  • 使用django_celery_beat在admin后台配置计划任务

    一 依赖包的安装 django中使用celery做异步任务和计划任务最头疼的点就是包之间版本兼容性问题 项目一启动花花报错 大概率都是版本问题 每次都会花很大时间在版本兼容性问题上 本例使用如下版本 Django 3 2 celery 5
  • ubuntu18.04虚拟机无法发现ADB设备解决办法

    bell r311 r311 android adb shell error insufficient permissions for device user in plugdev group are your udev rules wro
  • [现代控制理论]7_线性控制器设计_Linear Controller Design

    现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8 5 线性控制器设计 轨迹跟踪simulink 现代控制理论 8
  • elementUI中的滚动条

    elementUI中的滚动条
  • 基于Python的 LSTM模型,更加精准的时间序列预测

    来源 DeepHub IMBA 大家经常会遇到一些需要预测的场景 比如预测品牌销售额 预测产品销量 今天给大家分享一波使用 LSTM 进行端到端时间序列预测的完整代码和详细解释 我们先来了解两个主题 什么是时间序列分析 什么是 LSTM 时
  • vm虚拟机安装centos7后的网络设置

    虚拟机网卡设置为桥接模式 安装完centos7后 root登陆 vi etc sysconfig network scripts ifcfg ens33 如果是动态获取地址 BOOTPROTO dhcp 如果是设置静态地址 则 BOOTPR
  • html 跨域_跨域方案总结

    平时在开发中总是会遇到各种跨域问题 一直没有很好地了解其中的原理 以及其各种实现方案 今天在这好好总结一下 本文完整的源代码请猛戳 xiangxingchen blog github com 博客 建议大家动手敲敲代码 1 什么是跨域 为什
  • MATLAB使用技巧笔记

    1 遍历查询 find的效率要高于for循环的效率 2 return 直接退出程序或函数返回了 3 keyboard 通常应用在Debug模式下面 所以你的程序不是为了debug 请使用input函数 也就是说 我可以进行新的参数赋值等 这
  • 将html文件设置为安卓背景桌面,WinXP下将HTML文档设置为屏保的方法

    WinXP的屏幕保护程序多种多样 很多用户喜欢将一些自己的文档图片等设为屏保 今天我们要向大家介绍的是另一种新方法 将HTML文档设置为屏保 下面大家跟随小编一起设置吧 WinXP系统除将HTML文档设置为桌面背景之外 WinXP的活动桌面
  • 动态平衡网格交易_网格交易 套利:期货经典书籍

    期货市场技术分析 墨菲 这是一部技术分析的工具书 教科书 本书涵盖了技术分析自道氏以来所有重要的研究成果 因此 是期货交易者的入门必读书目之一 我在 货的前几年也至少读了三遍以上 日本蜡烛 图技术 尼森 蜡烛图是目前最常见的看盘的基本工具
  • 串口服务器的通讯模式

    串口服务器 一个为RS 232 485 422到PC IP之间完成数据转换的具有强大功能的方便快捷的通讯接口转换器 串口服务器通过作为服务器端 提供RS 232 485 422终端串口与TCP IP网络的数据双向透明传输 提供串口转网络功能
  • 各种排序比较

    直接插入排序 void InsertSort ElemType A int n int i j for i 2 i lt n i 依次将A 2 A n 插入到前面已排序序列 if A i key lt A i 1 key 若A i 的关键码
  • dataframe普通切片与loc,iloc选取数据

    import pandas as pd import numpy as np url https raw githubusercontent com HoijanLai dataset master PoliceKillingsUS csv
  • git合并多条提交记录

    git合并多条提交记录 git log 查看提交历史 上述有五个 commit 记录 如果我想合并四个 commit 记录 git rebase i HEAD 4 合并前面四个 commit 记录 也可以指定合并某个版本之前的版本 git
  • Elasticsearch学习(一)—— 虚拟机上搭建Elasticsearch

    Elasticsearch学习 一 虚拟机上搭建Elasticsearch 本文开始前已通过 VMware 创建好三个虚拟机并安装好jdk 操作系统 CentOS Linux release 7 2 1511 Core 64位 JDK版本
  • (四十二)MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的?

    今天来接着给大家讲解 MySQL中最牛的RR隔离级别 是如何同时避免不可重复读问题和幻读问题的 其实大家现在应该都知道 在MySQL中让多个事务并发运行的时候能够互相隔离 避免同时读写一条数据的时候有影响 是依托undo log版本链条和R