54 基于undo log多版本链条实现的ReadView机制,到底是什么?

mysql-MVCC机制 结论 在对版本链中的事务ID进行比较时,有以下规则: 如果版本链中的事务ID,落在最左边区域(tx_id < min_id),那表示当前版本是已经提交的事务,是可见的 如果版本链中的事务ID,是落在右边部分(tx_id > max_id),表示这个版本是由将来启动的事务生成的(将来的事务,也就是当前session生成事务ID之后,有其他session生成的新的事务ID),是不可见的 如果版本链中的事务ID,是落在中间区域(min_id <= tx_id <= max_id 阅读详情

接

着上次我们讲过的undo log多版本链条,我们来讲讲这个基于undo log多版本链条实现的ReadView 机制

把这个机制讲明白了,下一次我们再正式讲解RC和RR隔离级别下的MVCC多版本并发控制机制,就很容 易理解了。

这个ReadView呢,简单来说,就是你执行一个事务的时候,就给你生成一个ReadView,里面比较关键 的东西有4个

  • 一个是m_ids,这个就是说此时有哪些事务在MySQL里执行还没提交的;
  • 一个是min_trx_id,就是m_ids里最小的值;
  • 一个是max_trx_id,这是说mysql下一个要生成的事务id,就是最大事务id;
  • 一个是creator_trx_id,就是你这个事务的id

那么现在我们来举个例子,让大家通过例子来理解这个ReadView是怎么用的 假设原来数据库里就有一行数据,很早以前就有事务插入过了,事务id是32,他的值就是初始值,如下

图所示。

接着呢,此时两个事务并发过来执行了,一个是事务A(id=45),一个是事务B(id=59),事务B是要去更新这行数据的,事务A是要去读取这行数据的值的,此时两个事务如下图所示。

现在事务A直接开启一个ReadView,这个ReadView里的m_ids就包含了事务A和事务B的两个id,45和59,然后min_trx_id就是45,max_trx_id就是60,creator_trx_id就是45,是事务A自己。

这个时候事务A第一次查询这行数据,会走一个判断,就是判断一下当前这行数据的txr_id是否小于 ReadView中的min_trx_id,此时发现txr_id=32,是小于ReadView里的min_trx_id就是45的,说明你事 务开启之前,修改这行数据的事务早就提交了,所以此时可以查到这行数据,如下图所示。

接着事务B开始动手了,他把这行数据的值修改为了值B,然后这行数据的txr_id设置为自己的id,也就 是59,同时roll_pointer指向了修改之前生成的一个undo log,接着这个事务B就提交了,如下图所示。

这个时候事务A再次查询,此时查询的时候,会发现一个问题,那就是此时数据行里的txr_id=59,那么 这个txr_id是大于ReadView里的min_txr_id(45),同时小于ReadView里的max_trx_id(60)的,说明 更新这条数据的事务,很可能就跟自己差不多同时开启的,于是会看一下这个txr_id=59,是否在 ReadView的m_ids列表里?

果然,在ReadView的m_ids列表里,有45和59两个事务id,直接证实了,这个修改数据的事务是跟自 己同一时段并发执行然后提交的,所以对这行数据是不能查询的!如下图所示。

那么既然这行数据不能查询,那查什么呢?

简单,顺着这条数据的roll_pointer顺着undo log日志链条往下找,就会找到最近的一条undo log, trx_id是32,此时发现trx_id=32,是小于ReadView里的min_trx_id(45)的,说明这个undo log版本 必然是在事务A开启之前就执行且提交的。

好了,那么就查询最近的那个undo log里的值好了,这就是undo log多版本链条的作用,他可以保存一 个快照链条,让你可以读到之前的快照值,如下图。

看到这里,大家有没有觉得很奇妙?多个事务并发执行的时候,事务B更新的值,通过这套 ReadView+undo log日志链条的机制,就可以保证事务A不会读到并发执行的事务B更新的值,只会读 到之前最早的值。

接着假设事务A自己更新了这行数据的值,改成值A,trx_id修改为45,同时保存之前事务B修改的值的快照,如下图所示。

此时事务A来查询这条数据的值,会发现这个trx_id=45,居然跟自己的ReadView里的 creator_trx_id(45)是一样的,说明什么?

说明这行数据就是自己修改的啊!自己修改的值当然是可以看到的了!如下图。

 

接着在事务A执行的过程中,突然开启了一个事务C,这个事务的id是78,然后他更新了那行数据的值为 值C,还提交了,如下图所示。

这个时候事务A再去查询,会发现当前数据的trx_id=78,大于了自己的ReadView中的 max_trx_id(60),此时说明什么?

说明是这个事务A开启之后,然后有一个事务更新了数据,自己当然是不能看到的了!如下图。

此时就会顺着undo log多版本链条往下找,自然先找到值A自己之前修改的过的那个版本,因为那个 trx_id=45跟自己的ReadView里的creator_trx_id是一样的,所以此时直接读取自己之前修改的那个版 本,如下图。

不知道大家看到这里感觉如何?通过一系列的图,我相信每个人都能彻底理解这个ReadView的一套运 行机制了

通过undo log多版本链条,加上你开启事务时候生产的一个ReadView,然后再有一个查询的时候,根 据ReadView进行判断的机制,你就知道你应该读取哪个版本的数据。

而且他可以保证你只能读到你事务开启前,别的提交事务更新的值,还有就是你自己事务更新的值。假 如说是你事务开启之前,就有别的事务正在运行,然后你事务开启之后 ,别的事务更新了值,你是绝对 读不到的!或者是你事务开启之后,比你晚开启的事务更新了值,你也是读不到的!

通过这套机制就可以实现多个事务并发执行时候的数据隔离,下一次我们继续深入讲解RC和RR两个隔 离级别下,这个ReadView是如何运用的。

 

 

 

 
54 基于undo log多版本链条实现的ReadView机制,到底是什么?l.pdf 立即下载

相关推荐

华为OD机试_2025 B卷_模拟消息队列(Python,100分)(附详细解题思路)

时间排序:确保事件处理顺序正确消费者管理:集合操作高效维护状态优先级实现:利用消费者ID自然排序边界处理:正确处理空消费者情况。

测试工程师的成长之路 1117

深入理解MVCC与Read View:并发控制的关键要素

MVCC 快照读 深入理解R-R与R-C 理解Read view

sun_0228的博客 2114

手机拍照也能玩高光谱?教你用TensorFlow Lite在Android上实现实时RGB转高光谱

本文介绍了如何利用TensorFlow Lite在Android设备上实现实时RGB到高光谱的图像重构技术。通过深度学习模型优化和移动端部署策略,使智能手机具备专业级光谱分析能力,适用于农业检测、化妆品分析等多个领域。

weixin_29091105的博客 243

55 Read Committed隔离级别是如何基于ReadView机制实现的?

今天我们来给大家讲一下,基于之前我们说的ReadView机制是如何实现Read Committed隔离级别 的,那么当然了,首先就是要先做一些简单的回顾。 这个RC隔离级别,实际上意思就是说你事务运行期间,只要别的事务修改数据还提交了,你就是可以读 到人家修改的数据的,所以是会发生不可重复读的问题,包括幻读的问题,都会有的。 那么所谓的ReadView机制,之前我们讲过,他是基于undo log版本链条实现的一套读视图机制,他意 思就是说你事务生成一个ReadView,然后呢,如果是你事务自己更新的数据

limeOracle的博客 402

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 956

ZED2双目相机运行VINS-FUSION初试

基于ZED2运行VINS-MONO的经验,在运行VINS-FUSION前有几点tips想跟大家分享,应该能在运行的过程中避免一些踩坑吧。 TIPs 1)关于zed2标定 开始使用Kalibr进行相机单目/双目及联合标定,虽然重投影误差最高也就5个像素,但实际使用效果却并不好,故建议大家相机内参还是从ZED2相机发布出的topic获取或可尝试/usr/local/zed/settings文件下的参数文档 另,启动ZED2.launch的时候,会有一个相机(一般是左目)和IMU的轴系转换关系Camera-IMU

xiaojinger_123的博客 5354

MVCC机制:Undo Log版本链与ReadView机制

MVCC机制、undo Log版本链、ReadView机制,可重复读事务隔离级别,可重复读的实现原理及流程

Mai_Jun_Hao的博客 1602

【C++】ROS:ROS1环境配置与基础示例

ROS1环境配置与基础示例

DevFrank的博客 2102

基于undo log版本链实现的ReadView机制

ReadView是什么? ReadView是“快照读”SQL执行时MVCC提取数据的依据,快照读就是最普通的Select查询语句,当你执行时,就会生成ReadView。 当前读指执行下列语句时进行数据读取的方式: Insert、Update、Delete、 Select…for update、 Select…lock in share mode ReadView有四个关键变量: ① m_ids:活跃事务(未提交的事务)集合。 ② min_trx_id:活跃事务中最小的id。 ③ max_trx_id:

huangkechen的博客 638

AMD SDP 优快云 系列文章设计

摘要 本文档规划了7篇AMD SDP协议解析系列文章的技术博客设计方案。基于《Scalable Data Port (SDP) Specification》1.5.0版本(122页),面向SoC/NoC领域的RTL设计与验证工程师,构建从基础概念到验证实现的知识体系。 系列文章严格遵循协议规范边界,采用五类证据标签区分内容来源(规范原文、勘误、验证推导等),禁止补充未定义的实现细节。包含端口控制、事务传输、一致性协议等核心内容,最终落实到验证平台设计与覆盖率模型。 每篇文章采用统一模板:明确规范依据、问题导

元直的博客 157

基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的单相整流系统中PR(比例谐振)控制器的设计与实现方法。首先阐述了PR控制器相较于传统PI控制器的优势,能够有效消除交流信号跟踪中的稳态误差。接着系统讲解了PR控制器的传递函数原理、实用型设计(带带宽)及参数整定方法。通过Simulink建模步骤,包括主功率电路搭建、电压外环PI设计、电流指令生成、PR控制器实现(推荐MATLAB Function方法)和SPWM调制等关键环节。仿真对比显示PR控制在电流跟踪精度(THD仅1.9%)、功率因数(0.998)和动态响应(突变恢

amy_mhd的博客 689

多版本并发控制MVCC--MySQL

MySQL中MVCC介绍

Littewood的博客 1024

VS2019 C# 连接IBM DB2数据库并查询数据表

操作系统:win10 64位 C#:VS2019 数据库:IBM DB2v11.1_win64_expc 其他工具:IBM Data Studio ibm_ds4130_win 步骤一:使用命令行或是IBM DB2工具:Data Studio,创建一个数据库。这里名称为:Student CREATE DATABASE "Student" AUTOMATIC STORAGE YES ...

坚韧与专注 3795

MySQL:基于undo log多版链条实现的ReadView机制,到底是什么

这个ReadView机制,简单来说,就是指向一个事务的时候,会生成一个ReadView,里面比较关键的东西有四个: 一个是m_ids,就是说此时有哪些事务在MySQL里执行还没提交的 一个是min_trx_id,就是说m_ids里最小的值 一个是max_trx_id,就是说MySQL下一个要生成的事务ID,就是最大事务ID 一个是creator_trx_id,就是说当前事务的ID 举个例子: ...

OceanStar的博客 877

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mysql隔离性之Read View

Mysql隔离性之Read View 当前事务能读取到哪个历史版本? Read View是事务开启时,当前所有事务的一个集合,这个数据结构中存储了当前Read View中最大的ID及最小的ID。 这就是当前活跃事务列表,如下所示: ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3; ct-t...

泷泷养的乔小胖 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

4-mysql事务以及锁原理讲解

目录 版本链 ReadView READ COMMITED实现原理 REPEATABLE READ MVCC原理: 版本链 对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列( row_id并不是必要的,我们 创建的表中有主键或者非NULL唯一键时都不会包含row_id列): trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐...

liuhehe的博客 5492

从ReadView深入理解MySql MVCC原理

MySql MVCC 机制 在说MVCC机制前我们先了解ReadView。 ReadView是什么呢?在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下 参数说明: creator_trx_id:当前事务id m_ids:所有事务的事务id min_trx_id:m_ids里最小的事务id值 max_trx_id:最大事务id 我们来具体分析一下ReadView的作用,以及是如何解决脏读幻读,不可重复读的问题的 现在数据有一条数据,如下原始值,上一个已经提交

念念不忘,必有回响 9927

Mysql事务以

第四节-Mysql事务以及锁原理讲解 主参考 2020年最新阿里数据库MYSQL面试题全集|周瑜(面试看这个就够了!) 副参考 MySQL技术内幕 InnoDB存储引擎 (第2版) 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录第四节-Mysql事务以及锁原理讲解主参考副参考前言一、事务是什么?定义二、四种特性(ACID)1.原子性(A):2.一致性('C):3.隔离性(I):4.持久性(D):三、事务的使用开启,提交事务中止事务,使用rollback查看自动提交()隐式提

qq_44833146的博客 764

read view初探

innodb为实现MVCC所使用的内部快照,RR(REPEATABLE READ)隔离级别下在第一次查询时创建read view,RC(READ COMMITTED)隔离级别下会在每次查询时创建read view以下测试在RR隔离级别下,数据库版本为5.7.201. session A session B ...

weixin_30752377的博客 1285

53 理解MVCC机制的前奏:undo log版本链是个什么东西?

今天我们正式开始切入讲解MySQL中多个事务并发执行时的隔离到底是怎么做的,因为我们知道默认是 RR隔离级别,也就是说脏写、脏读、不可重复读、幻读,都不会发生,每个事务执行的时候,跟 别的事务压根儿就没关系,甭管你别的事务怎么更新和插入,我查到的值都是不变的,是一致的! 但是这到底是怎么做到的呢? 这就是由经典的MVCC多版本并发控制机制做到的,但是讲解这个MVCC机制之前,我们还得先讲讲 undo log版本链的故事,这是一个前奏,了解了这个机制,大家才能更好的理解MVCC机制。 简单来说呢,我们

limeOracle的博客 364

MVCC 多版本并发控制机制详解,undo log版本链和ReadView是如何避免并发问题

文章目录一 undo log版本链是什么东西?二 通过undo log多版本链条实现的ReadView机制三 Read Committed隔离级别是如何基于ReadView机制实现的四 ReadView是如何实现RR隔离级别的五 总结 一 undo log版本链是什么东西? 数据库的隔离级别,以及脏读,幻读,不可重复读, 为什么mysql的默认隔离级别RR,可以让脏读,不可重复读,幻读都不会发生呢?      这就是由经典的MVCC多版本并发控制机制做到的,讲解这个M

filling_l的博客 3666

链mysql_mysql 版本链机制 & readView

版本链机制 , readViewimginnodb表下存在两个隐藏列:trx_id : 存放事务idroll_pointer : 存放一个指向上一事务版本的指针版本链的作用:用一个单链表的结构存放每个事务版本对应的行的数据; 通过我当前的事务id可以获取对应的数据配合readView的活跃事务数组可以判断当前应该读取哪个节点的数据, 如果我当前事务不在版本链上就向前读取节点直到读取的节点ID不在活...

weixin_36230923的博客 332

基于undo log多版本链条实现的ReadView机制,到底是什么?

ReadView呢,简单来说,就是你执行一个事务的时候,就给你生成一个ReadView,里面比较关键的东西有4个: 一个是m_ids,这个就是说此时有哪些事务在MySQL里执行还没提交的; 一个是min_trx_id,就是m_ids里最小的值; 一个是max_trx_id,这是说mysql下一个要生成的事务id,就是最大事务id; 个是creator_trx_id,就是你这个事务的id 假设原来数据库里就有一行数据,很早以前就有事务插入过了,事务id是32,它的值就是初始值,如下图所示: 接着呢,此时两个

weixin_44583135的博客 301

undolog多版本链+ReadView机制实现mvcc多版本并发控制

今天和大家分享一下MVCC的知识,了解MVCC之后,你对mysql的事务隔离理解会更深入。 1.MVCC是什么? MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 它主要是用来处理mysql在多线程操作缓存数据时出现的一系列并发问题。 2.前置知识点 (1)什么是脏写、脏读、不可重复读、幻读? 网上相关资料很多,这里不做赘述 (2)四种隔离级

三3三的博客 3191

MySQL总结--MVCC(read view和undo log)

MVCC(Multi-Version Concurrency Control),即多版本并发控制,数据库通过它能够做到遇到并发读写的时候,在不加锁的前提下实现安全的并发读操作,是一种乐观锁的实现方式,能大大提高数据库的并发性能。

黄智霖的博客 8146
上一篇: 53 理解MVCC机制的前奏:undo log版本链是个什么东西?
下一篇: 55 Read Committed隔离级别是如何基于ReadView机制实现的?
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值