如何理解MySQL隔离性---3个记录隐藏字段、undo日志、Read View

目录

一、3个记录隐藏字段

二、undo 日志

三、read view


一、3个记录隐藏字段

        本片文章是帮助理解上篇文章Mysql隔离性的辅助知识。

        mysql在建表时,不仅仅创建了表的结构,还创建了3个隐藏字段。

DB_TRX_ID :6 byte,最近修改( 修改/插入 )事务ID,记录创建这条记录/最后一次修改该记录的事务ID

DB_ROLL_PTR : 7 byte,回滚指针,指向这条记录的上一个版本(简单理解成,指向历史版本就 行,这些数据一般在 undo log 中)

DB_ROW_ID : 6 byte,隐含的自增ID(隐藏主键),如果数据表没有主键, InnoDB 会自动以 DB_ROW_ID 产生一个聚簇索引

         DB_TRX_ID该字段占6个字节,其中存储最近修改或插入的事务ID,也就是你当前对表进行插入或者修改此时的事务ID就会被存储到该字段中。

        DB_ROLL_PTR占7个字节,为指针指向该记录的上一个版本。

        DB_ROW_ID占6字节,如果我们建表时没有主键,InnoDB会生成一个隐藏的主键,根据该主键来建立聚簇索引。

        假设当前的建立表为:

         实际的三个隐藏字段会这样存储:

           我们目前并不知道创建该记录的事务ID,隐式主键,我们就默认设置成null,1。第一条记录也没有其他版本,我们设置回滚指针为null。      

二、undo 日志

        MySQL的日志是具有功能性和保存数据的功能的。这里的数据包括sql语句。
        我们这里理解undo log,简单理解成,就是 MySQL 中的一段内存缓冲区,用来保存日志数据的就行。

       undo log主要解决两个问题:

        1.回滚

        2.MVCC ---》多版本控制 ---》来解决隔离性和 隔离级别

        我们上文表格中的数据为 1 , a。

        此时,来了一个事务10,准备修改 a 为 abc。undo log就要发挥作用。

        事务10,因为要修改,所以要先给该记录加行锁。

        修改前,现将改行记录拷贝到undo log中,所以,undo log中就有了一行副本数据。

        事务10提交,释放锁。

        现在又有一个事务11,准备修改 abc为dcb。

        事务11,因为也要修改,所以要先给该记录加行锁。

        修改前,现将改行记录拷贝到undo log中,所以,undo log中就又有了一行副本数据。此时,新的 副本,我们采用头插方式,插入undo log。

        事务11提交,释放锁。

        这样,我们就有了一个基于链表记录的历史版本链。所谓的回滚,无非就是用历史数据,覆盖当前数 据。 上面的一个一个版本,我们可以称之为一个一个的快照

        有了这个版本链,那回滚就可以依靠它来执行,想要回滚时直接将先前的数据覆盖现在的数据即可。

        那我在insert等其他修改时,其他事务要select,此时select读取,是读取最新的版本呢?还是读取历史版本?

        当前读:读取最新的记录,就是当前读。增删改,都叫做当前读,select也有可能当前读.

        快照读:读取历史版本(一般而言),就叫做快照读。

        我们可以看到,在多个事务同时删改查的时候,都是当前读,是要加锁的。那同时有select过来,如果也要读取最新版(当前读),那么也就需要加锁,这就是串行化。 但如果是快照读,读取历史版本的话,是不受加锁限制的。

        那么,是什么决定了,select是当前读,还是快照读呢?隔离级别.

        那么,如何保证,不同的事务,看到不同的内容呢?也就是如何如何实现隔离级别?

三、read view

        Read View就是事务进行 快照读 操作的时候生产的 读视图 (Read View),在该事务执行的快照读的那一 刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)

         Read View 在 MySQL 源码中,就是一个类,本质是用来进行可见性判断的。 即当我们某个事务执行快照 读的时候,对该记录创建一个 Read View 读视图,把它比作条件,用来判断当前事务能够看到哪个版本的 数据,既可能是当前最新的数据,也有可能是该行记录的 undo log 里面的某个版本的数据。

        简化后的结构体如图所示:

         该事务执行的快照读的那一 刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID,其中最小的id放在up_limit_id中,最大的id放在low_limit_id中。

        我们现在拥有的数据版本链(undo log中的链式结构)以及当前快照读的 ReadView。

        我们将read view中的事务id与数据版本链中id做对比,就能知道当前快照读所能读到的内容。

        在画图之前要记住

/** 高水位,大于等于这个ID的事务均不可见*/

trx_id_t  m_low_limit_id

/** 低水位:小于这个ID的事务均可见 */

trx_id_t  m_up_limit_id;

        我们举个例子。

         事务4:修改name(张三) 变成name(李四)

         当 事务2 对某行数据执行了 快照读 ,数据库为该行数据生成一个 Read View 读视图

//事务2的 Read View

m_ids; // 1,3

up_limit_id; // 1

low_limit_id; // 4 + 1 = 5,原因:ReadView生成时刻,系统尚未分配的下一个事务ID creator_trx_id // 2

        此时版本链是:

        现在要是对比,看事务二是否能读到版本链中的哪一个。

//事务2的 Read View

m_ids; // 1,3

up_limit_id; // 1

low_limit_id; // 4 + 1 = 5,原因:ReadView生成时刻,系统尚未分配的下一个事务ID creator_trx_id // 2

对比:

up_limit_id<DB_TRX_ID<=low_limit_id;

并且DB_TRX_ID不在m_Ids中。

证明,事务2可以读取事务4修改之后的版本。

        整篇文章的流程为:

        我们知道了建表时会创建三个隐藏的记录字段用来记录事务的ID、地址与隐藏的主键。这三个会帮助实现回滚,回滚需要用到undo log,undo log中存放的一个个副本数据成链状表示。在不同的隔离级别下,不同事务读到的数据不一样,需要read view来协助,在read view中的low_limit_id,up_limit_id与undo log中的DB_TRX_ID做对比,来判断能读到什么版本。

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

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

相关文章

微信抢红包操作步骤及需要安装软件的步骤

微信抢红包操作步骤&#xff1a; 打开微信&#xff0c;进入聊天窗口。 在聊天窗口中&#xff0c;如果有红包消息会显示“红包”字样&#xff0c;点击这条消息。 在红包界面&#xff0c;点击“抢红包”按钮。 如果是口令红包&#xff0c;需要输入正确的口令才能打开红包。 打开红…

iOS开发-JsonModel的学习及使用

IOS JsonModel的学习及使用 当我们从服务端获取到json数据后的时候&#xff0c;我们需要在界面上展示或者保存起来&#xff0c;下面来看下直接通过NSDictionary取出数据的情况。 NSDictionary直接取出数据的诟病。 NSString *name [self.responseObj objectForKey:"nam…

巧用Maya轴心操作技巧,让工作事半功倍!

Maya 是一款专业的三维软件&#xff0c;可以用于创建规模宏大的世界、复杂的角色和炫酷的特效。Maya的用户遍布动画行业、影视特效、广告和片头、平面设计行业&#xff0c;用户数量十分庞大。本文分享了maya轴心操作的小技巧&#xff0c;让设计师工作事半功倍&#xff0c;一起来…

一分钟了解自动化测试

目前自动化测试并不属于新鲜的事物&#xff0c;或者说自动化测试的各种方法论已经层出不穷&#xff0c;但是&#xff0c;能够明白自动化测试并很好落地实施的团队还不是非常多&#xff0c;我们接来下用通俗的方式来介绍自动化测试…… 首先我们从招聘岗位需求说起。看近期的职…

基于Java+SpringBoot制作一个社区宠物登记小程序

制作一个社区宠物登记小程序,帮助社区居民登记和管理他们的宠物信息,以便更好地跟踪和维护社区中的宠物状况,通过社区宠物信息登记系统,社区居民可以更好地管理自己的宠物信息,并与其他宠物所有者共享资源和信息。这将有助于提高社区宠物的福利和安全,促进社区成员之间的…

班级事务管理系统设计与实现

班级事务管理系统 后端采用Spring Boot开发。 cloud分支版本正在开发中&#xff0c;后端采用Spring Cloud进行改造。 系统架构 项目采用B/S架构&#xff0c;前后端通讯采用RESTful API&#xff0c;数据格式使用Json&#xff0c;认证Token格式采用JWT。 身份认证使用Spring …

【Essential C++课后练习】纯代码(更新中)

文章目录 第一章 C编程基础1.41.51.61.71.8 第二章 面向过程的编程风格2.12.22.32.42.52.6 第一章 C编程基础 1.4 /*********************************************************************说明:试着扩充这个程序的内容&#xff1a;&#xff08;1&#xff09;要求用户同时输…

jmeter性能测试常见的一些问题

一、request 请求超时设置 timeout 超时时间是可以手动设置的&#xff0c;新建一个 http 请求&#xff0c;在“高级”设置中找到“超时”设置&#xff0c;设置连接、响应时间为2000ms。 1. 请求连接超时&#xff0c;连不上服务器。 现象&#xff1a; Jmeter表现形式为&#xff…

Centos Linux带进度条复制(同步)文件和文件夹

centos linux 内建文件复制/备份命令 rsync 目的&#xff1a;我想从一个磁盘复制一堆文件到另一个磁盘&#xff0c;不希望改变文件的属性&#xff08;尤其是所有者、还有创建时间、修改时间&#xff09;&#xff0c;最好还得能给我显示进度条。文件太多了&#xff0c;好几百GB…

安防监控视频汇聚EasyCVR平台的FLV视频流在VLC中无法播放的原因排查

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

Mac 安装不在 Apple 商店授权的应用程序

文章目录 一、场景介绍二、实操说明 一、场景介绍 在日常的工作生活中&#xff0c;发现一些好用的应用程序&#xff0c;但是出于某些原因&#xff0c;应用程序的开发者并没有将安装包上架到苹果商店。 那么这些优秀的应用程序下载安装以后就会出现如下弹框被拒之门外 二、实操…

背上花里胡哨的书包准备run之webpack篇(+一些常问的面试题)

webpack理解&#xff1f; Webpack 是一个现代的静态模块打包工具。它是一个基于配置的构建工具&#xff0c;用于将多个模块&#xff08;包括 JavaScript、样式表、图像等&#xff09;打包成一个或多个 bundle&#xff0c;并提供了一种优化资源加载和管理的方式。 主要概念和工…

【论文阅读】基于深度学习的时序预测——Informer

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长序列数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 文章地址&#xff1a;https://arxiv.org/abs/2012.07436 github地址&#xff1a;https://github.com/zhouhaoyi/Informer2020 参考解读…

MFC遍历目录包括子目录下所有文件、特定类型文件

文章目录 用法实现遍历所有文件遍历所有txt文件用法 vector<CString> v; //获取所有文件 GetFilePath(v,L"D:\\test\\"); //文件路径储存在容器里面,遍历容器 for(int i=0

比特鹏哥5-数组【自用笔记】

比特鹏哥5-数组【自用笔记】 1.数组的概念2.一维数组的创建和初始化创建的语句结构初始化的语句结构 3.一维数组的使用数组的下标&#xff1a;从0开始&#xff0c;n个数组&#xff0c;最后一个的下标是n-1 4.一维数组在内存中的存储5.sizeof计算数组元素个数可以计算元素个数并…

计算机工作原理:进程调度

在计算机中&#xff0c;什么是进程&#xff1f;一个跑起来的程序就是一个进程&#xff0c;没跑起来就只能算一个程序。 在windows的任务管理器中&#xff0c;可以很清楚的看到有哪一些进程。 进程&#xff08;progress&#xff09;也叫任务&#xff08;task&#xff09;。 每…

侯捷 C++面向对象编程笔记——10 继承与虚函数

10 继承与虚函数 10.1 Inheritance 继承 语法&#xff1a;:public base_class_name public 只是一种继承的方式&#xff0c;还有protect&#xff0c;private 子类会拥有自己的以及父类的数据 10.1.1 继承下的构造和析构 与复合下的构造和析构相似 构造是由内而外 Container …

UML-活动图

目录 一.活动图概述: 1.活动图的作用&#xff1a; 2.以下场合不使用活动图&#xff1a; 3.活动图的基本要素&#xff1a; 4.活动图的图符 4.1起始状态 4.2终止状态 4.3状态迁移 4.4决策点 4.5同步条:表示活动之间的不同 5.活动图: 二.泳道&#xff1a; 1.泳道图&a…

有人管一管小天才电话手表吗?

作者 | 张未 来源 | 洞见新研社 潮流果然是个圈&#xff0c;曾经风靡2008年的“摇一摇”重回我们的视野当中。 这个对于成年人有些过时的产物&#xff0c;以儿童手表为载体&#xff0c;正入侵着小学生的社交圈&#xff0c;成为儿童的“社交密码”。 “碰一碰”加好友&#x…

vue3+ts 动态导入多文件组件

1、在components文件夹中新建index.ts文件&#xff08;components文件夹下为创建的组件&#xff09; // index.ts const modules import.meta.globEager("./*.vue"); //参数为组件路径 let componentsOpts {}const getCaption (obj, str, z: boolean) > {let…