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

Java后端面试八股文三天速刷指南:高频考点与面试表达技巧 在Java后端开发中,知识体系的系统化程度直接决定技术面试的深度与广度。从基础语法到JVM运行机制,从集合框架到Spring容器设计,再到Redis缓存与MySQL索引,每个核心模块都成为评估候选人工程素养的关键维度。理解HashMap的实现原理、JVM内存模型与垃圾回收机制,掌握Spring Bean生命周期和缓存穿透等典型场景,有助于形成“原理→设计动机→实践落地”的完整链路。清晰表达这类知识,不仅能在较高竞争强度的岗位面试中体现扎实功底,也能为实际系统的性能优化与稳定性治理提供直接支持。围绕一套高效的 阅读详情

今天我们来给大家讲一下,基于之前我们说的ReadView机制是如何实现Read Committed隔离级别 的,那么当然了,首先就是要先做一些简单的回顾。

这个RC隔离级别,实际上意思就是说你事务运行期间,只要别的事务修改数据还提交了,你就是可以读 到人家修改的数据的,所以是会发生不可重复读的问题,包括幻读的问题,都会有的。

那么所谓的ReadView机制,之前我们讲过,他是基于undo log版本链条实现的一套读视图机制,他意 思就是说你事务生成一个ReadView,然后呢,如果是你事务自己更新的数据,自己是可以读到的,或 者是在你生成ReadView之前提交的事务修改的值,也是可以读取到的。

但是如果是你生成ReadView的时候,就已经活跃的事务,在你生成ReadView之后修改了数据,接着提 交了,此时你是读不到的,或者是你生成ReadView以后再开启的事务修改了数据,还提交了,此时也 是读不到的。

所以上面的那套机制,实际上就是ReadView机制的一个原理。好,那么既然都回顾完了,我们就来看 看,如何基于ReadView机制来实现RC隔离级别呢?

其实这里的一个非常核心的要点在于,当你一个事务设置他处于RC隔离级别的时候,他是每次发起查 询,都重新生成一个ReadView!

大家注意,这点是非常重要的,接着我们通过画图一步一步来给大家演示这个RC隔离级别是怎么做到 的。

首先假设我们的数据库里有一行数据,是事务id=50的一个事务之前就插入进去的,然后现在呢,活跃 着两个事务,一个是事务A(id=60),一个是事务B(id=70),此时如下图所示。

现在的情况就是,事务B发起了一次update操作,更新了这条数据,把这条数据的值修改为了值B,所 以此时数据的trx_id会变为事务B的id=70,同时会生成一条undo log,由roll_pointer来指向,看下图:

这个时候,事务A要发起一次查询操作,此时他一发起查询操作,就会生成一个ReadView,此时 ReadView里的min_trx_id=60,max_trx_id=71,creator_trx_id=60,此时如下图所示。

这个时候事务A发起查询,发现当前这条数据的trx_id是70。也就是说,属于ReadView的事务id范围之 间,说明是他生成ReadView之前就有这个活跃的事务,是这个事务修改了这条数据的值,但是此时这 个事务B还没提交,所以ReadView的m_ids活跃事务列表里,是有[60, 70]两个id的,所以此时根据 ReadView的机制,此时事务A是无法查到事务B修改的值B的。

接着就顺着undo log版本链条往下查找,就会找到一个原始值,发现他的trx_id是50,小于当前 ReadView里的min_trx_id,说明是他生成ReadView之前,就有一个事务插入了这个值并且早就提交 了,因此可以查到这个原始值,如下图。

接着,咱们假设事务B此时就提交了,好了,那么提交了就说明事务B不会活跃于数据库里了,是不是? 可以的,大家一定记住,事务B现在提交了。那么按照RC隔离级别的定义,事务B此时一旦提交了,说 明事务A下次再查询,就可以读到事务B修改过的值了,因为事务B提交了。

那么到底怎么让事务A能够独到提交的事务B修改过的值呢? 很简单,就是让事务A下次发起查询,再次生成一个ReadView。此时再次生成ReadView,数据库内活 跃的事务只有事务A了,因此min_trx_id是60,mac_trx_id是71,但是m_ids这个活跃事务列表里,只 会有一个60了,事务B的id=70不会出现在m_ids活跃事务列表里了,如下图。

此时事务A再次基于这个ReadView去查询,会发现这条数据的trx_id=70,虽然在ReadView的 min_trx_id和max_trx_id范围之间,但是此时并不在m_ids列表内,说明事务B在生成本次ReadView之 前就已经提交了。

那么既然在生成本次ReadView之前,事务B就已经提交了,就说明这次你查询就可以查到事务B修改过 的这个值了,此时事务A就会查到值B,如下图所示。

到此为止,RC隔离级别如何实现的,大家应该就理解了,他的关键点在于每次查询都生成新的 ReadView,那么如果在你这次查询之前,有事务修改了数据还提交了,你这次查询生成的ReadView 里,那个m_ids列表当然不包含这个已经提交的事务了,既然不包含已经提交的事务了,那么当然可以 读到人家修改过的值了。

这就是基于ReadView实现RC隔离级别的原理,希望大家好好仔细去体会,实际上,基于undo log多版 本链条以及ReadView机制实现的多事务并发执行的RC隔离级别、RR隔离级别,就是数据库的MVCC多 版本并发控制机制。

他本质是协调你多个事务并发运行的时候,并发的读写同一批数据,此时应该如何协调互相的可见性。

 

 

 

 

 

 

 

55 Read Committed隔离级别是如何基于ReadView机制实现的?l.pdf 立即下载

相关推荐

CheckOutOfDateMrpSteps.py00000

CheckOutOfDateMrpSteps.py00000

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

Read Committed隔离级别 && ReadView机制 Read Committed隔离级别,也叫做RC隔离级别。意思是说事务运行期间,只要别的事务修改数据还提交了,就可以读到人家修改的数据的。所以会发生不可重复读以及幻读的问题。 而所谓的ReadView机制,它是基于undo log版本链条实现的一套读视图机制。意思是: 你事务生成一个ReadView,然后如果是你事务更新的数据,自己是可以读到的;或者是在你生成ReadView之前提交的事务修改的值,也是可以读到的。 但是如

OceanStar的博客 1141

Polymarket链上预测市场自动化交易代理开发实战指南

自动化交易代理是量化交易的核心工具,它通过预设的算法规则,自动执行市场分析、决策与下单操作,旨在提升交易效率与纪律性。其技术原理通常涉及实时数据获取、策略引擎计算、交易执行与风险管理等模块的协同工作。在区块链与DeFi领域,这类代理的价值尤为凸显,能够高效处理链上合约交互,捕捉去中心化市场的套利机会。具体到应用场景,链上预测市场如Polymarket,为自动化策略提供了丰富的博弈标的。本文以Polymarket交易代理项目为例,深入剖析其基于Node.js与ethers.js的技术栈实现,详解从环境配置、策

weixin_42533910的博客 581

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

基于Mind+、MOTT实现人工智能

@基于Mind+、MOTT实现人工智能 人工智能实验 一、实验目的及要求 【一】实现人脸识别 【二】实现云数据库应用 【三】实现测温数据mqtt上传至物联网云平台 二、实验原理与内容 基于二哈实现多人人脸学习和识别 基于TinywebDB实现云数据库应用 基于EasyIoT实现mqtt数据上传。 三、实验软硬件环境 硬件:掌控板 软件:Mind+ 四、实验过程(实验步骤、记录、数据、分析) 1.基于二哈实现多人人脸学习和识别 ①在Mind+扩展上的传感器选项选择HUSKYLENS AI 摄像头 ②配置哈士

weixin_44606930的博客 2368

VMware Workstation Pro 17 最新破解版安装教程(附永久激活密钥)

本文详细介绍了VMware Workstation Pro 17专业版的安装与配置指南,包括系统要求检查、官方版本安装流程、高级配置优化及常见问题排查。通过合规使用官方版本,开发者可以充分利用其强大的虚拟化能力,提升多平台开发与测试效率。

weixin_29327977的博客 3519

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

接 着上次我们讲过的undo log多版本链条,我们来讲讲这个基于undo log多版本链条实现的ReadView 机制 把这个机制讲明白了,下一次我们再正式讲解RC和RR隔离级别下的MVCC多版本并发控制机制,就很容 易理解了。 这个ReadView呢,简单来说,就是你执行一个事务的时候,就给你生成一个ReadView,里面比较关键 的东西有4个 一个是m_ids,这个就是说此时有哪些事务在MySQL里执行还没提交的; 一个是min_trx_id,就是m_ids里最小的值; 一个是ma

limeOracle的博客 295

基于ADRC算法的多旋翼飞行器抗扰动控制实践

本文详细介绍了基于ADRC算法的多旋翼飞行器抗扰动控制实践,通过线性扩张状态观测器(LESO)实时估算风力等扰动,实现提前补偿,显著提升飞行稳定性。文章结合具体案例和工程实现技巧,展示了ADRC在突风条件下的优异表现,为无人机控制提供了高效解决方案。

weixin_29284885的博客 189

多版本并发控制MVCC--MySQL

MySQL中MVCC介绍

Littewood的博客 1024

16、二阶差分功耗分析(DPA)的再审视

本文深入探讨了二阶差分功耗分析(DPA)中的关键问题,包括不同组合函数的性能、信息论分析以及在有轮廓和无轮廓攻击场景下的实验结果。通过对掩码AES和DES的模拟和实际攻击实验,研究了归一化乘积、求和和绝对差值等组合函数在不同噪声水平下的效率,并强调了信息论分析在评估侧信道对抗措施中的重要性。

leaf8的博客 117

SpringBoot从入门到精通(全)

前言 ==本博文结合软件idea进行主要讲解== **springboot的特性主要有** - 简化 Spring 应用程序的创建和开发过程 - 抛弃了繁琐的 xml 配置过程,采用大量的默认配置简化以及注解反射 - 直接使用 java main 方法启动内嵌的 Tomcat 服务器运行 Spring Boot 程序,不需要部署 war 包文件 **四大核心**分别为自动配置、起步依赖、Actuator和命令行界面

码农研究僧的博客 7万+

mysql隔离级别及实现原理

读未提交,它是性能最好,也可以说它是最野蛮的方式,因为它压根儿就不加锁,所以根本谈不上什么隔离效果,可以理解为没有隔离。串行化,读的时候加共享锁,也就是其他事务可以并发读,但是不能写;写的时候加排它锁,其他事务不能并发写也不能并发读。读已提交是通过MVCC+快照读实现的,每次执行语句的时候都要重新创建一次快照。可重复读是通过MVCC+快照读实现的,仅在事务开启的时候创建一次快照。并发更新:行锁解决了并发更新的问题。

375

开源数字人、虚拟直播部署教程

对,你无看错,是欧美的。在直播带货案例里,我们把模型导入到ue4,我们给模型在ue4里预设了四个动作(站着、站着说话、坐着、坐着说话),三个表情(平静、开发、愤怒),三个镜头(全局、近矩说话、看显示器播放商品展示)。我们只需要把目标主播的直播给录制下来,提取样本数据,然后训练一个从粉丝的不同刺激的组合,到主播的不同响应方式的多元逻辑回归的数学模型参数即可。

南七小僧的学海无涯 4554

InnoDB MVCC

MVCC:     multiversion concurrency control, 多版本并发控制,它提供基于某个时间的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据。而不管这个事务执行的时间有多长,故在不同事务看来,同一时刻看到的相同的行数据可能是不一样的,即:每一行数据会有多个版本数据(副本)。 InnoDB的实现: InnoDB的MVCC主要是根据u

zwleagle的专栏 843

VS2022编译xlnt库

xlnt是一个用于读写Excel文件的C++库,本文介绍如何用源代码编译静态或动态xlnt库

QQVQQ的博客 7285

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL问答200

本文涵盖MySQL全栈面试核心内容,包括:基础概念(关系型数据库特性、体系结构);存储引擎对比(InnoDB/MyISAM);索引原B+树、聚簇索引)与优化策略;事务ACID与隔离级别实现;锁机制(行锁、间隙锁)与MVCC原理;日志系统(redo/undo/binlog);SQL优化与执行计划分析;高可用方案(主从复制、分库分表);InnoDB底层机制(Buffer Pool、Checkpoint);以及MySQL 8.0新特性。

weixin_72753562的博客 827

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mysql自学

目录一、数据库概念二、mysql安装2.1 ubuntu安装mysql2.2 rockylinux安装mysql2.3 windows安装mysql2.4 数据初始化2.5 修改密码2.6 创建用户2.7 忘记密码2.8 默认端口2.9 远程连接三、数据库管理工具Dbeaver四、mysql练习库4.1 world库4.2 sakila库4.3 employees库4.4 自建库导出4.5 全库备份与恢复(all-databases)4.6 查询结果导出五、SQL语言六、五种数据类型6.1 整数型6.2 浮

zhangli2009x的博客 255

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

MySQL(开发篇)

外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。我们来看一个例子:左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。注意:目前上述两张表,只是在逻辑上存在这样一层关系,也就是逻辑外键;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

m0_61925586的博客 859

Mysql底层原理之事务(二)

一、事务基本概念 1、事务特性: A(Atomicity原子性):全部成功或全部失败 I(Isolation隔离性):并行事务之间互不干扰 D(Durability持久性):事务提交后,永久生效 C(Consistency一致性):通过AID保证 2、并发问题: 脏读(Drity Read):读取到未提交的数据 不可重复读(Non-repeatable read):两次读取结果不同 幻读(Phantom Read):select 操作得到的结果所表征的数据状态无法支撑后续的业务操作 3、隔.

u014225032的博客 254

MySQL的MVCC机制实现READ COMMITTED和 REPEATABLE READ隔离级别

MVCC实现依赖于 —— undo日志、隐藏字段、ReadView MVCC,多版本的并发控制,Multi-Version Concurrency Control undo日志: 例子:表中本来有记录(1,张三,一班) 事务10更新记录:(1,李四,一班)后又更新(1,王五,一班) 事务20更新记录:(1,钱七,一班)又更新(1,宋八,一班) 此时记录修改了四次,undo日志形成版本链: 隐藏字段: 每行记录后面保存两个隐藏的列:一个保存了行的事务ID(TRX_ID),一...

BaiHang111的博客 2287

Oracle视图(View)创建使用

Oracle对象教程:视图(View)创建使用,视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中查询信息与从表中查询信息的方法完全相同。只需要简单的SELECT…FROM即可。 视图具有以下优点: 1. 可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表。 2. 可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。

oraclestudyroad的博客 3051

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

RC隔离级别,实际上意思就是说事务运行期间,只要别的事务修改数据还提交了,就是可以读到人家修改的数据的,所以是会发生不可重复读的问题,包括幻读的问题,都会有的。 所谓的ReadView机制,是基于undo log版本链条实现的一套读视图机制,意思就是说事务生成一个ReadView,然后呢,如果是事务自己更新的数据,自己是可以读到的,或者是在生成ReadView之前提交的事务修改的值,也是可以读取到的。 但是如果生成ReadView的时候,就已经活跃的事务,在生成ReadView之后修改了数据,接着提交了,此

weixin_44583135的博客 500

mysql事务之提交读(Read Committed)

1,Read Commited定义: 在提交读(READ COMMITTED)级别中,基于锁机制并发控制的DBMS需要对选定对象的写锁(write locks)一直保持到事务结束,但是读锁(read locks)在SELECT操作完成后马上释放(因此“不可重复读”现象可能会发生,见下面描述)。和前一种隔离级别一样,也不要求“范围锁(range-locks)”。 简而言之,提交读这种隔离级别保证了...

Mergades 2万+

数据库事务特征、数据库隔离级别,各级别数据库加锁情况(含实操)--read committed && MVCC...

上节回顾 上篇记录了我对MySQL 事务 隔离级别** read uncommitted **的理解。 这篇记录我对 MySQL 事务隔离级别 read committed & MVCC 的理解。 前言 可以很负责任的跟大家说,MySQL 中的此隔离级别不单单是通过加锁实现的,实际上还有repeatable read 隔离级别,其实这两个...

u012780655的博客 581

事务隔离级别——READ-UNCOMMITTED(读未提交)

首先,我们先设置MySQL事务隔离级别为Read uncommitted 在my.ini配置文件最后加上如下配置 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. [mysqld] transaction-isolation = READ-UNCOMMITTED 重启MySQL服务 1、脏读 提...

Zzze0101的博客 5863

Mysql事务以

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

qq_44833146的博客 764
上一篇: 54 基于undo log多版本链条实现的ReadView机制,到底是什么?
下一篇: 排查定时任务为什么不执行
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值