[MySQL][深入理解隔离性][下][Read View]详细讲解

news2024/11/14 13:27:17

目录

  • 1.Read View
    • 1.是什么?
    • 2.理解
    • 3.整体流程
  • 2.RR与RC的本质区别
    • 1.当前读和快照读在RR级别下的区别
    • 2.RR与RC的本质区别


1.Read View

1.是什么?

  • Read View就是事务进行 快照读 操作的时候生产的 读视图(Read View),在该事务执行快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID,这个ID是递增的,所以最新的事务,ID值越大)
  • Read View 在 MySQL 源码中,就是一个类本质是用来进行可见性判断的
    • 即:当某个事务执行快照读的时候,对该记录创建一个 Read View 读视图,把它比作条件,用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的 undo log 里面的某个版本的数据
    • 注意:Read View是事务可见性的一个类,不是事务创建出来的,就会有Read View,而是当这个事务(已经存在),首次进行快照读的时候,MYSQL形成Read View
  • 下面是 ReadView 结构,但为了减少同学们负担,我们简化一下
    class ReadView
    {
        // 省略...
    private:
        /** 高水位,大于等于这个ID的事务均不可见*/
        trx_id_t m_low_limit_id
    
        /** 低水位:小于这个ID的事务均可见 */
        trx_id_t m_up_limit_id;
    
        /** 创建该 Read View 的事务ID*/
        trx_id_t m_creator_trx_id;
    
        /** 创建视图时的活跃事务id列表*/
        ids_t m_ids;
    
        /** 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,
         * 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/
        trx_id_t m_low_limit_no;
    
        /** 标记视图是否被关闭*/
        bool m_closed;
    
        // 省略...
    };
    
    m_ids; // 一张列表,用来维护Read View生成时刻,系统正活跃的事务ID
    up_limit_id; // 记录m_ids列表中事务ID最小的ID(没有写错)
    low_limit_id; // ReadView生成时刻系统尚未分配的下一个事务ID,也就是目前已出现过的事务ID的最大值+1
    creator_trx_id // 创建该ReadView的事务ID
    

2.理解

  • 在实际读取数据版本链的时候,是能读取到每一个版本对应的事务ID的,即:当前记录的DB_TRX_ID

  • 那么,现在手里面有的东西就有,当前快照读的 ReadView版本链中的某一个记录的DB_TRX_ID

  • 所以现在的问题就是,当前快照读,应不应该读到当前版本记录?

    请添加图片描述

  • 对应源码策略

    • 如果查到不应该看到当前版本,接下来就是遍历下一个版本,直到符合条件,才可以看到

    • 下面的 readview 是当你进行select的时候,会自动形成

      请添加图片描述

3.整体流程

  • 假设当前有条记录:

    nameage**DB_TRX_ID(**创建该记录的事务ID)**DB_ROW_ID(**隐式主键)**DB_ROLL_PTR(**回滚指针)
    张三28null1null
  • 事务操作:
    请添加图片描述

  • 事务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
    
  • 此时版本链是:
    请添加图片描述

  • 只有事务4修改过该行记录,并在事务2执行快照读前,就提交了事务
    请添加图片描述

  • 事务2在快照读该行记录的时候,就会拿该行记录的 DB_TRX_ID 去跟 up_limit_id,low_limit_id和活跃事务ID列表(trx_list)进行比较,判断当前事务2能看到该记录的版本

    // 事务2的 Read View
    m_ids;          // 1,3
    up_limit_id;    // 1
    low_limit_id;   // 4 + 1 = 5,原因:ReadView生成时刻,系统尚未分配的下一个事务ID
    creator_trx_id  // 2
    
    // 事务4提交的记录对应的事务ID
    DB_TRX_ID=4
    
    // 比较步骤
    DB_TRX_ID(4)< up_limit_id(1) ? 不小于,下一步
    DB_TRX_ID(4)>= low_limit_id(5) ? 不大于,下一步
    m_ids.contains(DB_TRX_ID) ? 不包含,说明,事务4不在当前的活跃事务中
    
    // 结论
    故,事务4的更改,应该看到
    所以事务2能读到的最新数据记录是事务4所提交的版本,而事务4提交的版本也是全局角度上最新的版本
    

2.RR与RC的本质区别

1.当前读和快照读在RR级别下的区别

  • select * from user lock in share mode;以加共享锁方式进行读取,对应的就是当前读

  • 测试表

    --设置RR模式下测试
    mysql> set global transaction isolation level REPEATABLE READ;
    
    --重启终端
    mysql> select @@tx_isolation;
    +-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    +-----------------+
    
    --依旧用之前的表
    create table if not exists account(
        id int primary key,
        name varchar(50) not null default '',
        blance decimal(10,2) not null default 0.0
    )ENGINE=InnoDB DEFAULT CHARSET=UTF8;
    
    --插入一条记录,用来测试
    mysql> insert into user (id, age, name) values (1, 15,'黄蓉');
    
  • 测试用例1-表1:
    请添加图片描述

  • 测试用例2-表2:
    请添加图片描述

  • 用例1与用例2:唯一区别仅仅是 表1 的事务B在事务A修改age前快照读过一次age数据,而 表2 的事务B在事务A修改age前没有进行过快照读

  • 结论:

    • 事务中快照读的结果是非常依赖该事务首次出现快照读的地方
      • 即某个事务中首次出现快照读,决定该事务后续快照读结果的能力
    • delete同样如此

2.RR与RC的本质区别

  • 正是Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同
  • 在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View,将当前系统活跃的其他事务记录起来
    • 此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改不可见
    • 即:RR级别下,快照读生成Read View时,Read View会记录此时所有其他活动事务的快照,这些事务的修改对于当前事务都是不可见的。而早于Read View创建的事务所做的修改均是可见
  • 在RC级别下的事务中,每次快照读都会新生成一个快照和Read View,这就是在RC级别下的事务中可以看到别的事务提交的更新的原因
    • 正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题
  • 总结:
    • 在RC隔离级别下,是每个快照读都会生成并获取最新的Read View
    • 而在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View

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

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

相关文章

白嫖游戏指南,Epic喜加一:《暗影火炬城》

前言 Epic喜加一&#xff1a;《暗影火炬城》《暗影火炬城》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&#xff0c;不定期更新哦&#xff01; 专栏&#xff1a;白嫖…

学习型组织:知识创造的 SECI 螺旋模型 —— 隐性知识和显性知识的转换

《创造知识的企业》的日本学者野中郁次郎用了 30 多年的时间跟踪日本企业的变化&#xff0c;揭示日本企业成功的奥秘。 在野中之前和之后&#xff0c;也有不少学者聚焦日本&#xff0c;但是&#xff0c;多数人看到的&#xff0c;只是优良的生产技术&#xff0c;企业和顾客、供…

【计算机网络】DHCP实验

一&#xff1a;实验目的 1&#xff1a;深入理解DHCP&#xff08;动态主机配置协议&#xff09;的工作原理和数据包交换过程。 2&#xff1a;掌握如何通过命令行释放和重新获取IP地址&#xff0c;并通过抓包软件分析DHCP消息的具体内容。 二&#xff1a;实验仪器设备及软件 硬…

数据挖掘-数据预处理

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 文章目录 3.3.1 数据的中心趋势平均数和加权平均数众数&#xff0c;中位数和均值描述数据的离散程度 &a…

推荐3款将相片变为动漫风格的免费AI工具推荐

toonme ToonMe是一款功能强大的在线和移动端应用&#xff0c;专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术&#xff0c;能够快速识别照片中的面部特征&#xff0c;并进行智能处理&#xff0c;生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…

AJAX-XMLHttpRequest 详解

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 XMLHttpRequest 概述 主要用途 工作流程 示例代码 GET 请求示例 POST 请求示例 注意事项 工作…

Java集合——Array、ArrayList、LinkedList

1. ArrayList和Array的区别 1. 大小和自动扩容 Array&#xff1a;创建时指定大小&#xff0c;大小固定。若数组被创建&#xff0c;其大小不能更改 ArrayList&#xff1a;动态数组实现&#xff0c;可以动态增长或缩小。在不断添加元素时&#xff0c;ArrayList会自动进行扩容 …

模式Hash和history

vuerouter有两种路由模式Hash和history。区别&#xff1a;Hash为默认模式&#xff0c;url中包含一个#符号的哈希部分。优势&#xff1a;兼容性好&#xff0c;不需要后端服务器的特殊配置。缺点&#xff1a;不够美观&#xff0c;搜索引擎优化较差。History模式使用的浏览器的His…

Cmake生成的Xcode工程相对路径与绝对路径的问题

Cmake生成的Xcode工程相对路径与绝对路径的问题 文章目录 Cmake生成的Xcode工程相对路径与绝对路径的问题前言修改.pbxproj文件验证工程小结 前言 由于Cmake的跨平台的自动化构建的方便性以及他广泛应用于编译过程的管理&#xff0c;在开发过程中难免用到Cmake。我也使用Cmake…

CTF-NSSCTF[GKCTF 2021]

[GKCTF 2021]easycms 考察&#xff1a; 用扫描工具扫描目录&#xff0c;扫描到后台登录界面/admin.php 题目提示了密码是五位弱口令&#xff0c;试了试弱口令admin和12345直接成功了 任意文件下载 点击设计-->主题然后随便选择一个主题&#xff0c;点击自定义&#xff0…

C++客户端Qt开发——Qt窗口(浮动窗口)

4.浮动窗口 在Qt中&#xff0c;浮动窗口也称之为铆接部件。浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口一般是位于核心部件的周围&#xff0c;可以有多个。 设置一个浮动窗口并添加控件 #include "mainwindow.h" #include "ui_mainwindow.h"…

现代Java开发:使用jjwt实现JWT认证

前言 jjwt 库 是一个流行的 Java 库&#xff0c;用于创建和解析 JWT。我在学习spring security 的过程中看到了很多关于jwt的教程&#xff0c;其中最流行的就是使用jjwt实现jwt认证&#xff0c;但是教程之中依然使用的旧版的jjwt库&#xff0c;许多的类与方法已经标记弃用或者…

人工智能GPT技术进步的新时代,你做好准备了吗?

OpenAI 最新发布的 GPT-4o Mini 模型以其卓越的性能和极具竞争力的价格引发了广泛关注。这款模型在提供高级语言理解和生成能力的同时&#xff0c;也在计算资源的消耗和部署成本上做出了显著优化&#xff0c;使得更多开发者能够轻松访问和使用。这篇文章将分析 GPT-4o Mini 在技…

python爬虫【3】—— 爬虫反反爬

一、常见的反爬手段和解决方法 二、splash 介绍与安装 三、验证码识别 图片验证码的处理方案 手动输入(input) 这种方法仅限于登录一次就可持续使用的情况图像识别引擎解析 使用光学识别引擎处理图片中的数据&#xff0c;目前常用于图片数据提取&#xff0c;较少用于验证码…

从零搭建pytorch模型教程(八)实践部分(二)目标检测数据集格式转换

前言 图像目标检测领域有一个非常著名的数据集叫做COCO&#xff0c;基本上现在在目标检测领域发论文&#xff0c;COCO是不可能绕过的Benchmark。因此许多的开源目标检测算法框架都会支持解析COCO数据集格式。通过将其他数据集格式转换成COCO格式可以无痛的使用这些开源框架来训…

【计算机网络】DNS命令练习与抓包分析实验

一&#xff1a;实验目的 1&#xff1a;掌握DNS缓存的清除方法&#xff0c;了解DNS缓存的作用和影响。 2&#xff1a;熟悉nslookup和dig等DNS查询工具的使用&#xff0c;理解DNS查询的基本原理和过程。 3&#xff1a;通过抓包和分析&#xff0c;深入了解DNS查询和响应消息的格…

探索 LLamaWorker 本地大模型API服务的新功能:函数调用

LLamaWorker 是一个基于 LLamaSharp 项目开发的可以在本地运行大模型服务&#xff0c;并提供与 OpenAI / Azure OpenAI 兼容的 API。同时&#xff0c;通过工具提示词的配置&#xff0c;提供函数调用 Function Call 能力&#xff0c;为开发者提供更多的可能。 1. 背景 在人工智…

Robot Operating System——AsyncParametersClient监控Parameters的增删改行为

大纲 同步创建SyncParametersClient设置监控回调回调函数主体测试完整代码 异步创建AsyncParametersClient设置监控回调测试完整代码 在《Robot Operating System——Parameter设置的预处理、校验和成功回调》一文中&#xff0c;我们使用Node::add_post_set_parameters_callbac…

Django项目中报错:django.template.exceptions.TemplateDoesNotExist: index.html

访问127.0.0.1&#xff1a;8000访问出错 查看报错原因 到Django项目当中找到settings.py&#xff0c;找到TEMPLATES中的DIRS: 添加如下代码&#xff0c;并导入OS模块&#xff1a; "DIRS": [os.path.join(BASE_DIR,templates)] 再次访问IP地址&#xff1a;

【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

目录 1- 引言&#xff1a;类加载器1-1 类加载器是什么&#xff1f;(What)1-2 为什么要用类加载器&#xff1f; 作用&#xff1a;类加载的过程&#xff1f;(Why) 2- ⭐核心&#xff1a;类加载器详解(How)2-1 类加载器分类2-2 什么是双亲委派模型&#xff1f;2-3 为什么采用双亲委…