MVCC 实现原理

news2024/11/27 5:25:14

💟这里是CS大白话专场,让枯燥的学习变得有趣!

💟没有对象不要怕,我们new一个出来,每天对ta说不尽情话!

💟好记性不如烂键盘,自己总结不如收藏别人!

💌 在讲解 MVCC 之前先来看一下 MySQL 中事务的四种隔离级别

🍠 读未提交:一个事务可以读到另一个事务未提交的数据。

🍠 读已提交(RC):Oracle 默认,如果一个事务还没有提交,其他事务不能读到该数据。

🍠 可重复读(RR):MySQL 默认,事务A在读到一条数据之后,事务B对该数据进行了修改并提交,事务A再读该数据还是原来的内容,这就需要 MVCC 来实现。

🍠 可串行化:读写加锁。

💌 快照读(一致性读):使用快照信息显示基于某个时间点的查询结果,而不考虑与此同时运行的其它事务所执行的修改。(select * from XXX)

🍠 在 RC 中,每次读取都会重新生成一个快照,总是读取行的最新版本,因此事务中每次 select 也可以看到其它已提交事务所做的修改。

🍠 在 RR 中,快照会在事务中第一次查询语句执行时生成,只有在本事务中对数据进行更改才会更新快照,但会产生幻读。如果在本事务中已经执行了一次 select,其它事务执行了更改数据的操作并已提交,在本事务再次 select 时看不到其它事务所做的更改。

P.S. 当前读:insert、update、delete、select...for update 等。

 💌 脏读、不可重复读、幻读的区别:

🍠 脏读:读取了未提交事务的数据(读取阶段,事务进行了回滚等)。

🍠 不可重复读:同一个事务先后两次查询的数据不一致,可能两次查询之间另一个事务执行了更新的操作并已提交。

🍠 幻读:在同一个事务当中先后两次查询结果的总数不一致(插入阶段)。

💌 接下来我们就仔细研究下 MVCC 如何实现 RR 的:

我们知道 MySQL 的三大日志:undo log、redo log、bin log,涉及到回滚的就是 undo log,主要保存了数据的基本信息:

此外,还包含两个隐藏字段 trx_id roll_pointer

🍠 trx_id :当前这个事务的 id,递增。

🍠 roll_pointer:一个指针,指向上一个版本的 undo log,形成版本链。

💌 基于 undo log 版本链实现 ReadView 机制,它是快照读提取数据的依据:

  • m_ids:当前活跃的事务 id 集合。
  • min_trx_id:m_ids 里最小事务 id。
  • max_trx_id:下一个要生成的事务 id。
  • creator_trx_id:ReadView 创建者的事务 id。

 根据 ReadView 在版本链中提取满足条件的数据:

🍠 判断当前事务 trx_id 是否等于 creator_trx_id,等于则可以访问(update 之后立即 select)。

🍠 判断 trx_id 是否小于 min_trx_id,小于则已提交,可访问。

🍠 判断 trx_id 是否大于 max_trx_id,大于则是当前 ReadView 生成后产生的,不可访问。

🍠 在二者之间,若不在 m_ids 中则已提交,可访问。

 💌 由此 MVCC 可实现可重复读~~

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

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

相关文章

Pycharm 安装PyQt5

第一步: 新建项目文件夹 新建项目 新建一个 Pyqt5Tools 的文件夹 这里放到了 D盘 安装成功 第二步: 安装相关包 安装PyQt5 pip3 install -i https://pypi.douban.com/simple PyQt5,PyQt5-tools时间根据网速 更新下pip python.exe -m pip install --upgrade pip -i https:…

tensorRT推理相关及遇到的坑

tebsorRT是什么 tensorRT是NVIDIA出的一个高性能深度学习推理(inference)优化器,可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorF…

数据库隔离级别

1. 数据库隔离级别 1.1 事务 事务只是一个改变,是一些操作的集合;用专业的术语讲,他就是一个程序的执行单元;事务本身其实并不包含这4个特性,只是我们需要通过某些手段,尽可能的让这个执行单元满足这四个特…

Java学习路线(20)——多线程

一、线程(Thread) 1、概念: 是一个程序内部的一条执行路径 2、分类 单线程: 程序中只有一条执行路径多线程: 程序中有多条执行路径 二、多线程的创建 1、Thread的概念: Java通过java.lang.Thread类代表…

HTTP 教程2

HTTP 消息结构 HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。 一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端)&#xff…

什么是C/S架构?与B/S架构有什么区别?

1、 1.1、C/S架构的全称是Client/Server,即客户端/服务器体系结构,主要应用于局域网内。 1.2、B/S架构的全称为Browser/Server,即浏览器/服务器结构。百度安全验证https://baijiahao.baidu.com/s?id1742761249590653499&wfrspider&f…

微信小程序——CSS限制文字宽度和行数(溢出显示省略号)

手把手教你学会判断用户在做向上滑动还是向下滑动 知识回调(不懂就看这儿!)场景复现核心干货单行文本溢出显示省略号多行文本溢出显示省略号 知识回调(不懂就看这儿!) 知识专栏专栏链接微信小程序专栏http…

基于HTML+CSS+JavaScript的在线图书阅读网页设计

目 录 1.项目总体设计 2 1.1需求分析 2 1.2网站结构分析 3 1.2.1导航栏 3 1.2.2主体部分 3 1.3网络风格分析 3 1.4网站结构图 3 2.项目详细设计 4 2.1登录页面设计 4 2.2主页页面设计 5 2.3在线读书页面设计 6 3.项目总结 7 4.参考文献 7 此网页能够满足喜欢看书的书友&#x…

深度学习 - 53.Bert 简介与 Keras-Bert 常用示例

目录 一.引言 二.Bert 简介 1.Embedding Layer 2.Encoder layer 3.Pre-training 与 Fine-Tuning 三.Keras-Bert 常用 Demo 1.获取预训练模型 2.加载预训练模型 3.Fill Text 4.IsCorrelation 5.Get Embedding 6.完整代码 四. Fine-Tuning 五.Bert VS OpenAI GPT …

chatgpt赋能python:Python中等待一秒的语句:让你的程序暂停与等待

Python中等待一秒的语句:让你的程序暂停与等待 当编写Python程序时,经常需要添加暂停或延迟功能,以使程序能够在执行某些操作之前或之后等待一段时间。Python拥有一个内置的语句可以实现这种延迟:time.sleep()。 什么是 time.sl…

四信大气环保远程监测平台,实现大气网格化、精准化监测

近年来,随着国民经济快速发展,我国工业化、城镇化进程加快,随之造成的大气污染问题日益严峻,严重影响人们日常生活幸福指数与身体健康。为此,中共中央、国务院先后发布一系列文件,要求加强大气环境监测&…

价格限制与经济福利

价格控制 实行价格控制通常是政府相信市场价格对买方或卖方不公平两种价格控制:价格上限和价格下限 价格上限: 法定最高价格,任何人不得收取或付出高于此的价格。 价格下限: 法定最低价格,任何人不得收取或付出低于…

为什么亚马逊股价会在今年上涨?亚马逊股价2023年还会继续上涨吗?

来源:猛兽财经 作者:猛兽财经 为什么亚马逊的股价会上涨? 今年以来,亚马逊(AMZN)的股价已经上涨了20%以上,涨幅达到了23.3%。而同期标普500指数今年以来仅上涨了8.2%。 猛兽财经认为&#xff0c…

数据链路层:媒体接入控制

1.数据链路层:媒体接入控制 笔记来源: 湖科大教书匠:媒体接入控制的基本概念 湖科大教书匠:随机接入–CSMA/CD协议 湖科大教书匠:随机接入–CSMA/CA协议 声明:该学习笔记来自湖科大教书匠,笔记…

微信小程序——监听页面滑动(二)判断用户在做向上滑动还是向下滑动(onScrollPage scroll-view)

手把手教你学会判断用户在做向上滑动还是向下滑动 知识回调(不懂就看这儿!)场景复现核心干货onPageScroll结合scrollTop实现了解touch方法 知识回调(不懂就看这儿!) 知识专栏专栏链接微信小程序专栏https:…

1.WebGL与Shader介绍

webgl介绍 WebGL是一种用于在网页浏览器中创建交互式3D图形的技术。它基于OpenGL ES 2.0,这是一个广泛使用的嵌入式系统3D图形API。以下是webgl的发展史: WebGL允许开发人员使用JavaScript编写代码来控制GPU(图形处理单元)&…

字符集、字符编码格式检测和转码

目录 1 locale与字符集 1.1 locale 1.2 字符集 2 常见字符集 2.1 Native ANSI 字符集 2.1.1 ASCII 2.1.2 ISO-8859-1 2.1.3 GB2312,GBK,GB18030 2.2 Unicode 字符集 2.2.1 UCS 2.2.2 UTF - Unicode Transformation Format 2.2.3 UTF-8 2.2.4 B…

Spring Boot如何实现分布式消息队列

Spring Boot如何实现分布式消息队列 在分布式系统中,消息队列是非常重要的一部分,可以帮助开发人员实现异步处理、解耦系统、提高系统可靠性等。本文将介绍如何使用 Spring Boot 实现分布式消息队列。 1. 消息队列的设计 消息队列是一种存储消息的容器…

一键禁掉WIN10自动更新

工作了很久,没备份睡觉去了,一觉起来我东西呢? 正玩着游戏,激战正嗨的时候,蓝屏转圈圈开始更新。 无数次搜索怎么去除WIN10自动更新,每次按照网上的教程操作,结果都是无功而返。 下载了很多工…

Java开发 - 让你少走弯路的Redis主从实现单节点哨兵模式

前言 前一篇中,我们讲解了Redis主从的搭建方式,其实很简单呐有木有,都是配置,连句代码都没有,是不是感觉高估了Redis主从的搭建方式?哈哈,没关系,跟着博主,包你全会。今…