mysq在RR级别怎么解决不可重复读和幻读

news2024/11/18 11:42:18

1、定义

不可重复读: 事务1读取一行,事务2然后修改或删除该行数据并且提交事务,事务1再次读取结果不一样;

幻读:事务1按条件读取查询数据,事务2按照同样的条件新增一条或多条数据并且提交事务,事务1再次读取结果不一致

版本链:对该条记录每次更新后,都会将旧值放到一条undo日志中,随着更新次数的增加,最新的版本加上之前的所有旧版本就会被roll_pointer属性连接成一个链表,这个链表就是版本链版本链的头节点就是当前记录最新的值

  

每次使用update对记录进行改动时,都会记录一条undo日志,每条undo日志也都有一个roll_pointer属性(insert操作对应的undo日志没有该属性,因为该记录并没有最早的版本),可以将这些undo日志连接起来形成一个链表

readview的四个属性

1、creator_trx_id:当前事务id
2、m_ids:当前系统中所有未提交的事务id的集合
3、min_trx_id:m_ids中最小的事务id
4、max_trx_id:  m_ids中最大的事务id在加1,也就是下一个要生成的事务id

2、原理:
 

在这里插入图片描述

在这里插入图片描述

文字描述: 

1、版本的trx_id==READVIEW中的creator_trx_id,表示当前读事务正在读取被自己修改过的记录,
   该版本可以被当前事务访问;
2、版本trx_id < min_trx_id,表明生成该版本的事务在当前事务生成READVIEW前已经提交了,
   所以该版本可以被当前事务访问;
3、版本的trx_id > max_trx_id,表明生成该版本的事务在当前事务生成READVIEW后才开启的,
  该版本不可被当前事务访问;
4、版本的trx_id在READVIEW的min_trx_id和max_trx_id之间,需要分两种情况  
   1) trx_id 在 m_ids 数组中,那么当前事务不能读取到。为什么呢?
   row_trx_id 在 m_ids 数组中表示的是和当前事务在同一时刻开启的事务。(保证可重复读)
   2) trx_id 在不在m_ids 数组中,那么当前事务可以读到?【只会发生在读已提交】
      说明该事务在生成redview的时候已经被提交 所以当前事务可以读取该数据
 

 读已提交rc:每次读取都会新生成一个readview快照;

可重复度rr:是以一个事务为单位,只在第一次读取(select)数据时生成ReadView;

(快照读是基于MVCC+undo log来实现的,所以快照读只存在于RC和RR隔离级别下;未提交读和串形化隔离级别下都是当前读)

 读已提交,出现不可重复读是因为每次查询都是一个新的readview(产生新的trxId),也就是说查询之前,可以读取到已经提交的事物,(王五-->赵六),可重复读一直在一个rearview内,前后都是一个事物(ID=1),当发现版本4不在m_ids[1,2,3]内,那么会根据roll_pointer指针去undo_log的版本链需找前一个,也就是trx_id=3,得到name=王五,也就是可重复度;

那为什么不能解决幻读呢?

幻读是由于第二次读物的数据 新增了数据,而insert的时候,属于第一次进入undoLog,没有历史版本,他的roll_pointer=null,对应数据values ('王五',18),通过name=王五,查找到age=18这个数据的时候,没有办法找到之前到版本,于是返回了age=18,最后结果就是两条:age=20和18;

mysql怎么协助rr解决幻读?

 通过间隙锁

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

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

相关文章

mysql8查看大事务

文章目录 1、查看大事务的原因2、构建测试数据3、模拟大事务场景4、查询mysql的事务5、查询大事务的详情 1、查看大事务的原因 大事务的特点是执行时间长&#xff0c;长期占有锁不释放&#xff0c;导致其他想操作同一行数据的线程阻塞&#xff0c;如果客户端设置了超时时间&am…

单正态总体和双正态总体的假设检验

1.单正态总体和双正态总体的假设检验 笔者之前的相关笔记&#xff1a; 1.正态总体下常见的抽样分布 2.假设检验&#xff08;Hypothesis Testing&#xff09; 个人理解假设检验&#xff1a;先对总体参数提出一个假设值&#xff0c;利用样本信息判断这一假设是采取拒绝该假设还是…

opencv人与摄像头距离检测

参考&#xff1a; https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ WeChat_20230611160620 1、cv2加载摄像头慢解决方法&#xff0c;单独重新cv2.VideoCapture() https://b…

使用vue进行Lodop打印的一些方法

文章目录 使用Lodop进行打印的一般步骤vue中使用lodopkr-print-designer简介打印模板设计器打印预览模板设计页面安装引入 Lodop是一个JavaScript控件&#xff0c;用于在Web应用程序中进行打印操作。 使用Lodop进行打印的一般步骤 下载Lodop控件&#xff1a;首先&#xff0c;你…

对比学习做了什么?

什么是对比学习&#xff1f; 对比学习貌似处于“无明确定义、有指导原则”的状态 什么是对比学习呢&#xff1f;(这个是微信链接)全文比较长&#xff0c;但是逻辑框架还是不错的。 如果想要更快速的了解什么是对比学习或者说对比学习是怎么做的&#xff0c;可以看SimCLR这个模…

全网最详细,软件测试-性能测试岗面试题总结(大全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 描述一下你们公司…

论文阅读:Denoising Diffusion Probabilistic Models

论文阅读&#xff1a;Denoising Diffusion Probabilistic Models 最近一两年&#xff0c;在图像生成领域&#xff0c;扩散模型受到了越来越多的关注&#xff0c;特别是随着 DALL-E2 以及 Midjourney 的持续火爆&#xff0c;扩散模型也变得越来越流行&#xff0c;之前很多基于 …

C++ 参数的三种传递方式和应用场景

C 参数的三种传递方式分别是值传递、指针传递和引用传递。 值传递 值传递的实质 将实参的值&#xff08;a、b&#xff09;复制到形参(m、n)相应的存储单元中&#xff0c;即形参和实参分别占用不同的存储单元。 值传递的特点 值传递的特点是单向传递&#xff0c;即主调函数…

Java Web开发实战经典学习过程笔记

Java Web开发实战经典学习简单笔记 第一章 Java Web 开发简介 1.胖客户端程序指的是&#xff0c;当一个程序运行时需要一个单独的客户端程序支持(如&#xff1a;QQ)。瘦客户端程序在操作时不需要任何其他程序的安装(如&#xff1a;登录网上论坛&#xff0c;只需浏览器即可)。 2…

I.MX6ull UART

一 简介 UART 全称叫做串行接口&#xff0c;通常也叫做 COM 接口&#xff0c;串行接口指的是数据一个一个的顺序传输&#xff0c;通信线路简单。使用两条线即可实现双向通信&#xff0c;一条用于发送&#xff0c;一条用于接收。串口通信距离远&#xff0c;但是速度相对会低&…

Self-Attention 自注意力机制

输出形式 李宏毅讲到&#xff1a; 模型的输入是只有一种形式——词向量但是输出的形式却是不唯一的&#xff0c;主要有以下三种&#xff1a; 每一个向量对应一个输出(多对多&#xff0c;且一一对应) 每个序列只有一个输出(多对一) 一个序列对应一个序列(多对多&#xff0c;长…

MySQL 索引的10 个核心要点

文章目录 &#x1f349;1. 索引底层采用什么数据结构&#xff1f;为什么不用hash&#x1f349;2. B树与B树区别&#xff1f;为何用B树&#xff1f;&#x1f349;3. 自增主键理解&#xff1f;&#x1f349;4. 为什么自增主键不连续&#x1f349;5. Innodb为什么推荐用自增ID&…

代码随想录第59天

1.下一个更大元素II 有两种方法&#xff1a; 1.把两个一样的数组拼起来&#xff1a; // 版本一 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nu…

Chapter7: SpringBoot与数据访问

尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…

《Reinforcement Learning: An Introduction》第4章笔记

Chapter 4 Dynamic Programming 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一类在给定完备环境模型的MDP后用来计算最优策略的算法。动态规划算法在强化学习中因为&#xff1a;1. 假设有一个完美的环境模型&#xff1b;2. 极大的计算代价 实际用处…

树莓派4B连接不了产品开的热点

目的 关于树莓派连接不了产品开的5G热点&#xff0c; 当时还是一头雾水。 参考这篇博客 把思路方向转向了频率&#xff0c; 信道&#xff0c; 通过给的产品A相关规格说明wifi 5.18GHz, 信道36。 于是乎我两款产品A、产品B为例。 树莓派是能连接产品B开的热点&#xff08;5.74…

【Unity SRP】实现基础的Temporal AA(未完)

写在前面 【技术美术图形部分】简述主流及新的抗锯齿技术&#xff0c;花了点时间盘点了一些主流AA技术&#xff0c;再在SRP下的URP管线中实现一下目前游戏用得比较多的TAA。参考Unity的TAA&#xff08;比较容易懂&#xff09;以及sienaiwun的实现思路&#xff0c;也参考了很多…

OpenCV转换HDR图像与源码分析

我们常见的图像位深一般是8bit&#xff0c;颜色范围[0, 255]&#xff0c;称为标准动态范围SDR(Standard Dynamic Range)。SDR的颜色值有限&#xff0c;如果要图像色彩更鲜艳&#xff0c;那么就需要10bit&#xff0c;甚至12bit&#xff0c;称为高动态范围HDR(High Dynamic Range…

Docker部署ES集群、kibana、RabbitMq和chrome安装elasticsearch-head插件

文章目录 [toc] 1.安装ES集群和kibana1.1安装ES集群1.1.1 准备挂载目录1.1.2 准备配置文件1.1.3 启动命令1.1.3.0 启动前设置系统环境变量1.1.3.1 Windows10环境启动命令1.1.3.2 Linux环境启动命令 1.2安装kibana1.2.1 准备挂载目录1.2.2 准备配置文件1.2.3 启动命令1.2.3.1 Wi…

Spring IOC基于XML和注解管理Bean(一)

Spring IOC基于XML和注解管理Bean&#xff08;二&#xff09; 文章目录 1、IoC容器1.1、控制反转&#xff08;IoC&#xff09;1.2、依赖注入1.3、IoC容器在Spring的实现 2、基于XML管理Bean2.1、搭建模块spring-first2.2、实验一&#xff1a;获取bean①方式一&#xff1a;根据i…