IT职场笔记

news2024/9/21 16:21:07

MySQL笔记之一致性视图与MVCC实现

一致性读视图是InnoDB在实现MVCC用到的虚拟结构,用于读提交(RC)和可重复度(RR)隔离级别的实现。

一致性视图没有物理结构,主要是在事务执行期间用来定义该事物可以看到什么数据。

 

一、Read View

事务在正式启动的时候我们会创建一致性视图,该一致性视图是基于整个库的。

1、transaction id

InnodDB的每个事务都有一个唯一的事务ID,叫做transaction id,该ID在事务开始的时候向InnoDB申请,并且按照申请顺序严格递增。

每行数据都会有多个版本,每次事务更新数据的时候都会生成一个新的数据版本,并且把transaction id赋值给这个数据版本的事务id,称为row trx_id。

上图是一条行数据的多个版本,最新的版本是 V4。

其中U3、U2、U1代表的是undo log,V1、V2、V3在物理上并不真实存在,而是在需要的时候通过V4配合undo log计算获得。

2、ReadView如何工作

ReadView中主要包含4个比较重要的内容:

  • m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。
  • min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。
  • max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。
  • creator_trx_id:表示生成该ReadView的事务的事务id。

在访问某条记录时,按照下边的步骤判断记录的某个版本是否可见:

  • 如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值大于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。
  • 如果被访问版本的trx_id属性值在ReadView的min_trx_id和max_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

3、记录未提交的场景

如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本。

如果最后一个版本也不可见的话,那么就意味着该条记录对该事务完全不可见,查询结果就不包含该记录。

二、不同隔离级别下生成ReadView区别

在MySQL中,READ COMMITTED和REPEATABLE READ隔离级别的区别就是它们生成ReadView的时机不同。

1、可重复读隔离

MySQL的默认隔离级别是RR(可重复读),按照 可重复读的语义,每个事务启动的时候只能看到已经提交的事务,并且在本事务执行的过程中,不可以读取到其他事务的更新操作。

在InnoDB 中,为每个事务构造了一个  当前事务ID数组的快照,就是记录事务开启时,当前正在执行的事务ID 的集合。数组里面 trx_id 最小的记为 低水位,trx_id 最大的 + 1 记为高水位。如下图所示:

对于一个新事务而言,所读取到的记录版本的 trx_id 可能有以下几种情况:

1、在绿色区域:说明数据版本在事务开始前已提交,当前版本是可见的。

2、在红色区域:说明数据版本在事务开始后变更的,当前版本是不可见的。

3、在橙色区域:包含 2 种情况。

A、如果 数据版本的 trx_id 在数组中,说明是正在执行的事务,不可见。

B、如果 数据版本的 trx_id 不在数组中,说明是已经提交的事务,可见。

可以看出,InnoDB 利用了 UndoLog 数据多版本的特点,实现了快速创建快照的能力。

2、读已提交

对可重复读来说,事务只有在第一次进行读操作时才会生成一个ReadView,后续的读操作都会重复使用这个ReadView。 

也就是说,如果在此期间有其他事务提交了,那么对于可重复读来说也是不可见的,因为对它来说,事务活跃状态在第一次进行读操作时就已经确定下来,后面不会修改了。

对读已提交来说,事务中的每次读操作都会生成一个新的ReadView。

也就是说,如果这期间某个未提交事务Commit了,那么它就会从ReadView中移除,添加到已提交事务中,这样确保RC级别下事务每次读操作都能读到已经提交的数据。

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

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

相关文章

Python爬虫+数据可视化:分析唯品会泳衣数据详情

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 唯品会是中国领先的在线特卖会电商平台之一,它以“品牌特卖会”的模式运营,为会员提供品牌折扣商品。 唯品会的商品包括服装、鞋类、箱包、美妆、家居、母婴、食品等各类品牌产品。 这就是今天…

RFID在半导体行业的应用解决方案

半导体行业近几年来受到疫情因素和政治因素的影响,导致国内芯片的短缺问题十分严重,在国家大力发展制造企业的趋势下,不少企业也加大了芯片制造工厂的投入。RFID作为一种可非接触识别的技术,是如何应用在半导体行业中的?下面我们…

JsonPath使用和示例

JsonPath使用和示例 1 简介2 官方实例3 JsonPath与XPath语法对比4 实例说明JsonPath与XPath语法5 Python中JsonPath模块6 Python中JsonPath使用7 结合接口测试的实例 1 简介 官网:https://goessner.net/articles/JsonPath/;JsonPath 是一种简单的方法来…

做了5年软件测试决定离职,跳槽历经40场面试, 面的基本都是大厂

前言 沉寂了好一段日子,连我们公司自己人都问我为什么最近都不写文章了。 那么当看到本篇的标题的时候,大家应该可以猜到这是为什么了。 我最终还是决定要离开服务了 5 年多的公司。 而这次跳槽历经 3 个月,前后聊了 10 家公司,进…

问题:idea启动项目错误提示【command line is too long. shorten command line】

问题:idea启动项目错误提示【command line is too long. shorten command line】 参考博客 问题描述 启动参数过长,启动项目,错误提示 原因分析 出现此问题的直接原因是:IDEA集成开发环境运行你的“源码”的时候&#xff08…

Spring学习笔记之入门程序

文章目录 关于下载介绍jar包第一个入门程序关于入门程序的小细节启用Log4j2 关于下载 这是一个悲惨而又戏剧性的故事 其实是不用下的,spring的jar包是归meaven管的,不用特地的去spring官网再去什么github上下载,再去看什么乱七八糟的目录&a…

IDEA的基础使用——【初识IDEA】

IDEA的基础使用——【初识IDEA】 文章目录 IDEA简介前言官网 IDEA的下载与安装选择下载路径勾选自己需要的其余按默认选项进行即可 目录简介安装目录简介 运行Hello WorldIDEA快捷键常用模板模板一:psvm(main)模板二:模板三&#…

adb常用命令使用

1.查看当前运行的包名和Activity adb shell dumpsys window | findstr mCurrentFocus 2.卸载app adb uninstall io.appium.settings adb uninstall io.appium.unlock adb uninstall io.appium.android.ime

Ubutun安装中文语言和搜狗输入法

Unbuntu版本是18.04的。要安装中文语言和搜狗输入法。 参考官方说明 Install languages 安装网址:搜狗输入linux安装网址 安装搜狗输入法:看搜狗输入法的指南是最权威的: 搜狗输入法安装指南linux 拖拽语言(最开始中文是在下面的…

软件外包开发的后台开发语言

在软件外包开发中,后台语言的选择通常取决于项目需求、客户偏好、团队技能和开发效率。今天和大家分享一些常用的后台语言及选择它们的原因,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。…

软件测试质量度量之 “三级指标体系”

管理学大师彼得 - 德鲁克曾说过:无数据不管理。 数字是人们快速认知事物的一种有效方式。无论在生活还是工作,对事还是对人都息息相关。碰上难以的用数字描述事物或现象肯定是没有找对适用的指标和度量方式。尤其对于质量工程方面的工作,定量…

从小白到大神之路之学习运维第70天-------Docker容器引擎基础

第四阶段提升 时 间:2023年7月31日 参加人:全班人员 内 容: Docker容器引擎基础 目录 一、Docker概述 (一)容器背景: (二)云计算模式: (三&#x…

Python+OpenCV实现自动扫雷,挑战扫雷世界记录!

目录 准备 - 扫雷软件 实现思路 - 01 窗体截取 - 02 雷块分割 - 03 雷块识别 - 04 扫雷算法实现 福利:文末有Python全套资料哦 我们一起来玩扫雷吧。用PythonOpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。 中级 - 0.74秒 …

大数据技术之Clickhouse---入门篇---安装

星光下的赶路人star的个人主页 努力到无能为力,拼搏到感动自己 文章目录 1、ClickHouse的安装1.1 准备工作1.1.1 确定防火墙处于关闭状态1.1.2 CentOS取消打开文件数限制1.1.3 安装依赖(所有节点都进行依赖安装)1.1.4 CentOS取消SELINUX 1.2 …

OPC DA 客户端与服务器的那点事

C#开发OPC客户端,使用OPCDAAuto.dll。在开发过程中偶遇小坎坷,主要记录一下问题解决办法。 1、建立客户端,参考链接。建立WinFrom工程,将博客中代码全部复制即可运行: https://www.cnblogs.com/kjgagaga/p/17011730.…

Linux 查看服务器内存、CPU、网络等占用情况的命令

1、查看物理CPU个数:cat cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l 2、查看服务器CPU内核个数:cat 每个物理CPU中core的个数(即核数) cat /proc/cpuinfo | grep "cpu cores" | u…

【数据库】事务隔离级别

事务特征ACID 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,没有中间状态。它确保了数据的完整性。一致性(Consistency):事务执行后,数据库从…

02_modbus从站从开始初始化到接收一帧数据的流程

0. 协议栈接收状态的变化图 1.协议栈的初始化和使能 void eMBRTUStart( void ) {ENTER_CRITICAL_SECTION( );/* Initially the receiver is in the state STATE_RX_INIT. we start* the timer and if no character is received within t3.5 we change* to STATE_RX_IDLE. This…

网络请求fetch

fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求。浏览器原生提供这个对象 fetch()的功能与 XMLHttpRequest 基本相同,但有三个主要的差异。 与 Ajax 类似,Fetch 也是前后端通信的一种方式。Fetch 要比 Ajax …

DBeaver远程连接使用DM数据库

DBeaver 工具版本使用 21.3.2 测试可用 数据库连接驱动包 需要提前下载DM数据库连接驱动DmJdbcDriver18.jar 驱动下载地址:https://eco.dameng.com/document/dm/zh-cn/app-dev/java-MyBatis-Plus-frame.html 配置数据库驱动 数据库 ---- 驱动管理 新建驱动 驱动…