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

news2025/6/20 23:49:47

目录

一、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.coloradmin.cn/o/862044.html

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

相关文章

uniapp-原生地图截屏返回base64-进行画板编辑功能

一、场景 vue写uniapp打包安卓包&#xff0c;实现原生地图截屏&#xff08;andirod同事做的&#xff09;-画板编辑功能 实现效果&#xff1a; 二、逻辑步骤简略 1. 由 原生地图nvue部分&#xff0c;回调返回 地图截屏生成的base64 数据&#xff0c; 2. 通过 uni插件市场 im…

Go异常处理机制panic和recover

recover 使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数&#xff0c;然后将panic抛向上一层&#xff0c;直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃&#xff0c;recover只有被defer后才是有意义的。 func main() { p…

如何让ES低成本、高性能?滴滴落地ZSTD压缩算法的实践分享

前文分别介绍了滴滴自研的ES强一致性多活是如何实现的、以及如何提升ES的性能潜力。由于滴滴ES日志场景每天写入量在5PB-10PB量级&#xff0c;写入压力和业务成本压力大&#xff0c;为了提升ES的写入性能&#xff0c;我们让ES支持ZSTD压缩算法&#xff0c;本篇文章详细展开滴滴…

Ceph集群安装部署

Ceph集群安装部署 目录 Ceph集群安装部署 1、环境准备 1.1 环境简介1.2 配置hosts解析(所有节点)1.3 配置时间同步2、安装docker(所有节点)3、配置镜像 3.1 下载ceph镜像(所有节点执行)3.2 搭建制作本地仓库(ceph-01节点执行)3.3 配置私有仓库(所有节点执行)3.4 为 Docker 镜像…

C语言可变数组 嵌套的可变数组,翻过了山跨过了河 又掉进了坑

可变数组 ​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 数组中元素是顺序存放&#xff0c;这一特性让我们…

Java获取路径时Class.getResource()和ClassLoader.getResource()区别

Java中取资源时&#xff0c;经常用到Class.getResource()和ClassLoader.getResource()&#xff0c;Class.getResourceAsStream()和ClassLoader().getResourceAsStream()&#xff0c;这里来看看他们在取资源文件时候的路径有什么区别的问题。 环境信息&#xff1a; 系统&#…

css3瀑布流布局遇见截断下一列展示后半截现象

css3 瀑布流布局遇见截断下一列展示后半截现象 注&#xff1a;css3实现瀑布流布局简直不要太香&#xff5e;&#xff5e;&#xff5e;&#xff5e;&#xff5e; 场景-在uniapp项目中 当瀑布流布局column-grap:10px 相邻两列之间的间隙为10px&#xff0c;column-count:2,2列展示…

基于k8s的devOps自动化运维平台架构设计(中英文版本)

▲ 点击上方"DevOps和k8s全栈技术"关注公众号 In the rapidly evolving landscape of software development and IT operations, DevOps has emerged as a transformative approach to bridge the gap between development and operations teams. One of the key ena…

第五期(2022-2023)传统行业云原生技术落地调研报告——央国企篇

随着国务院国资委印发《关于加快推进国有企业数字化转型工作的通知》&#xff0c;开启了国有企业数字化转型的新篇章。大型央、 国企纷纷顺应趋势&#xff0c;加速云化布局&#xff0c;将数字化转型工作定位为“十四五”时期重点任务。同时&#xff0c;越来越多的企业通过云原生…

【Leetcode】155. 最小栈、JZ31 栈的压入、弹出序列

作者&#xff1a;小卢 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 155. 最小栈 155. 最小栈 题目描述; 设计一个支持 push &#xff0c;pop &#xff0c;top …

C语言笔记7

#include <stdio.h> int main(void) {int a123;int b052;//十进制42int c0xa2;//十进制162printf("a%d b%o c%x \n",a,b,c);//分别是十进制 八进制 十六进制printf("a%d b%d c%d \n",a,b,c);printf("Hello 凌迟老头\n");return …

uniapp 使用canvas画海报(微信小程序)

效果展示&#xff1a; 项目要求&#xff1a;点击分享绘制海报&#xff0c;并实现分享到好友&#xff0c;朋友圈&#xff0c;并保存 先实现绘制海报 <view class"data_item" v-for"(item,index) in dataList" :key"index"click"goDet…

并发——线程池,Executor 框架

文章目录 1 简介2 Executor 框架结构(主要由三大部分组成)1) 任务(Runnable /Callable)2) 任务的执行(Executor)3) 异步计算的结果(Future) 3 Executor 框架的使用示意图 1 简介 Executor 框架是 Java5 之后引进的&#xff0c;在 Java 5 之后&#xff0c;通过 Executor 来启动…

vue+springboot基于web的火车高铁铁路订票管理系统

铁路订票管理系统按照权限的类型进行划分&#xff0c;分为用户和管理员两个模块。管理员模块主要针对整个系统的管理进行设计&#xff0c;提高了管理的效率和标准。主要功能包括个人中心、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等&#…

解决遥感技术在生态、能源、大气等领域的碳排放监测及模拟问题

以全球变暖为主要特征的气候变化已成为全球性环境问题&#xff0c;对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

单源最短路

无负环 Dijkstra 迪杰斯特拉算法 采用的贪心的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点&#xff0c;直到扩展到终点为止 Dijkstra求最短路 I 给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1 …

微服务 云原生:基于 Gogs + Drone 实现 CI/CD 自动化

一般构建部署 以一个简单的前后端项目来说&#xff0c;分别编写前后端的 Dockerfile 文件并构建镜像&#xff0c;然后编写 docker-compose.yml 构建部署&#xff0c;启动运行。每次代码变更后都需重新手动打包、构建、推送。 一个简单的例子&#xff1a; 前端&#xff1a; 项…

解读HTML-入门第一文

HTML详细解读 概念解读基本结构常用标签标题标签&#xff08;h1~h6&#xff09;段落标签&#xff08;p&#xff09;链接标签&#xff08;a&#xff09;图像标签&#xff08;img&#xff09;列表标签&#xff08;ul、ol、li&#xff09;表格标签&#xff08;table、tr、td&#…

轻量级锁实现1——结构体解析、初始化

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;14 文档用途 从底层理解轻量级锁的实现&#xff0c;从保护共享内存的角度理解轻量级锁的使用场景&#xff0c;包括上锁、等待、释放&#xff0c;理…

android 如何分析应用的内存(十六)——使用AS查看Android堆

android 如何分析应用的内存&#xff08;十六&#xff09;——使用AS查看Android堆 在前面&#xff0c;先介绍了如何使用jdb和VS code查看应用栈相关内容。 本文将介绍&#xff0c;如何查看堆中的内容。大概有&#xff1a; 堆中的对象&#xff0c;有哪些堆中的对象&#xff0…