【必会面试题】快照读的原理

目录

    • 前言
    • 知识点
    • 一个例子

前言

快照读(Snapshot Read)是数据库管理系统中一种特殊的读取机制,主要用于实现多版本并发控制(MVCC, Multi-Version Concurrency Control)策略,尤其是在MySQL的InnoDB存储引擎中。其核心目的是在高并发环境下提供一致性的非锁定读取,以提高读操作的性能。

知识点

先来张图:
在这里插入图片描述

  1. 多版本并发控制(MVCC):MySQL InnoDB 引擎使用MVCC来管理事务并发时的数据版本。每个事务看到的数据是由其开始时数据库状态的快照组成,而不是最新的数据状态。如此以来,事务之间就不会因为读操作而相互阻塞。

  2. 事务ID与版本号:每当一个新的事务开始时,MySQL会分配给它一个唯一的事务ID。在执行更新操作时,InnoDB不会直接修改原有数据行,而是将更改保存在新的记录中,并标记新记录的事务ID(或版本号),同时保留旧版本的记录。

  3. Undo Logs(回滚日志):为了支持快照读,InnoDB使用Undo Logs来保存数据的旧版本。当事务需要查看某个数据的历史版本时,可以通过Undo Logs回滚到该事务开始时的数据状态。

  4. Read View(读视图):在可重复读(Repeatable Read)隔离级别下,事务第一次执行快照读操作时,会创建一个Read View。这个Read View记录了当前活跃事务的列表以及它们的事务ID。之后的快照读都将依据这个Read View来决定数据的可见性:事务能看到所有在它之前提交的事务所做的更改,但看不到在其之后开始的事务所做的更改。

  5. 数据可见性判断:在进行快照读时,会根据Read View和Undo Logs来判断数据的可见性。如果数据的最新版本是由一个在当前事务启动后才开始的事务所修改的,则会通过Undo Logs回溯到该数据的一个旧版本,确保读取的是一个一致性的视图。

  6. 隔离级别影响:在不同的事务隔离级别下,快照读的行为有所不同。例如,在读已提交(Read Committed)隔离级别下,每次快照读都会创建一个新的Read View,而在可重复读(Repeatable Read)级别下,整个事务周期内只创建一个Read View。

通过这些机制,快照读使得事务能够在不加锁的情况下读取数据,降低了锁的竞争,提高了系统的并发性能,同时也保证了事务间的隔离性和数据一致性。

一个例子

假设我们有一个表users,包含两列:idname,初始数据如下:

idname
1Alice
2Bob

假设有两个并发事务T1和T2:

  1. 事务T1开始:事务T1开始执行,此时MySQL为T1分配了一个事务ID(假设为100)。

  2. T1执行快照读:T1想要读取用户Alice的信息,由于这是T1的第一次读操作,InnoDB为T1创建一个Read View。此时没有其他活动事务,所以Read View中记录的活跃事务列表为空。

  3. 事务T2开始并更新数据:接着,事务T2开始(事务ID为200),T2决定将Alice的名字改为Carol,并提交这个更改。InnoDB不会直接覆盖原记录,而是创建一个新的版本记录,标记其由事务200修改,同时保留原始记录(Alice)作为Undo Log的一部分。

  4. T1再次执行快照读:现在,T1再次读取用户Alice的信息。由于T1已经有了自己的Read View(里面没有活动事务ID大于100的事务),它不会看到T2所做的更改。InnoDB通过Undo Logs回滚到T1开始时的状态,因此T1看到的仍然是Alice,而不是Carol。这就是快照读的效果——T1看到的是一个一致性的数据视图,仿佛T2的更改从未发生过。

在这个例子中,快照读确保了事务T1在多次读取同一条记录时,结果保持一致(即“可重复读”),同时避免了T1和T2之间的读写冲突,提高了并发处理能力。

在这里插入图片描述

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

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

相关文章

text2sql、nl2sql框架总结

DB-GPT DB-GPT 语雀 Vanna DAIL-SQL data-copilot SuperSonic:腾讯音乐开源 Chat BI 平台,开启 Text-to-SQL 全新体验

Oracle数据库面试题-6

21. 请解释Oracle数据库中的容灾解决方案,如GoldenGate等。 Oracle数据库中的容灾解决方案旨在确保在发生严重的灾难事件(如地震、火灾、洪水等)时,数据库能够迅速恢复正常的业务操作,同时最小化损失。容灾解决方案通…

特征优化+模型优化

一、优化思路梳理 课前准备   在昨天的内容中,我们通过使用更强的集成模型以及模型融合的方法,已经顺利将比赛分数提高至前20%。但正如此前所说,之前的一系列操作只不过是遵循了常规操作流程进行的数据处理与建模,若希望能够更进…

面试题:Proxy 相较于 Object.defineProperty 有什么优势?

面试题:Proxy 相较于 Object.defineProperty 有什么优势? Object.defineProperty 详解 语法:Object.defineProperty(obj, prop, descriptor) 功能:在一个对象上定义一个新属性或修改其现有属性,并返回此对象。 参数…

界面控件Telerik UI for WPF中文教程 - 用RadSvgImage升级应用程序UI

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成Visual Studio…

笔记-Python中的struct模块

了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,char,bool等等),方便对某一结构对象进行处理。而在网络通信当中,大多传递的数据是以二进制流(binary …

ADB命令来捕获设备屏幕快照和发送鼠标事件来实现抓取公众号文章

ADB命令来捕获设备屏幕和发送鼠标事件来实现抓取公众号文章 现在公众号需要登陆账号才能看到评论内容。登陆要账号的密码等,token还会过期。 现在的很多小程序进行了加密,那是否有方案可以抓取小程序或公众号的数据呢? 解决方案: …

【简报】VITA 74 (VNX)B

1 为什么向AMSAT社区提及VPX / VNX 1.1VPX是包括卫星在内的最新一代军用车辆增长最快的标准 VITA 65 – 面向地面车辆的 OpenVPX文献检索将揭示在许多商业和军事坚固型系统应用中的广泛应用VITA 78 – AFRL和工业界正在开发用于卫星的“SpaceVPX”和“Space VPX Lite” 1.2 …

R语言数据分析15-xgboost模型预测

XGBoost模型预测的主要大致思路: 1. 数据准备 首先,需要准备数据。这包括数据的读取、预处理和分割。数据应该包括特征和目标变量。 步骤: 读取数据:从CSV文件或其他数据源读取数据。数据清理:处理缺失值、异常值等…

AWS Load Balancer Controller 实践

背景 通过编写K8S的Ingress 然后能自动创建 aws的LB 作用 控制器监视 Kubernetes Ingress 或 Service 资源。作为响应,它会创建相应的 AWS 弹性负载均衡资源。您可以通过对 Kubernetes 资源应用注释来配置负载均衡器的特定行为。例如,您可以使用注释将 AWS 安全组附加到负…

人工智能_机器学习097_PCA数据降维算法_数据去中心化_特征值_特征向量_EVD特征值分解原来和代码实现---人工智能工作笔记0222

降维算法的原理,一会咱们再看,现在先看一下,算法 可以看到PCA算法的,原理和过程,我们先看一下代码 为了说明PCA原理,这里,我们,先来计算一下X的方差,可以看到 先把数据进行去中心化,也就是用数据,减去数据的平均值. B = X-X.mean(axis=0) 这段代码是用于计算矩阵X的每一列减去该…

websockets怎么工作的呢?

WebSockets是一种在单个TCP连接上进行全双工通信的协议,使得客户端和服务器之间的数据交换变得更加简单,并允许服务端主动向客户端推送数据。下面是WebSockets的工作原理: 1. **握手阶段**: - 客户端发起一个HTTP请求到服务器&…

react+vite创建

要在本地初始化一个结合了React和Vite的项目,你可以遵循以下步骤: 1、安装Node.js: 确保你的机器上已安装了Node.js。如果未安装,请前往Node.js官网下载并安装。 2、使用终端或命令提示符: 打开你的终端(…

测试工程师经常使用的Python中的库,以及对应常用的函数

os (操作系统接口) 该库提供了许多与操作系统交互的函数,如文件处理、目录操作、进程管理等。 常用功能包括: os.name: 获取操作系统的名称。 os.path: 用于操作文件路径的模块,如os.path.join拼接路径。 os.mkdir: 创建目录。 os.remove: 删…

EE trade:通货膨胀对老百姓意味着什么

通货膨胀,是经济领域中的一个常见现象,对社会各阶层尤其是普通老百姓的生活产生了深远影响。理解通货膨胀对老百姓的真实含义,可以帮助我们更好地应对日常生活的变化与挑战。 1. 生活成本的上升 最直接的影响体现在生活成本上。通货膨胀会导致…

Linux操作系统:Redis在虚拟环境下的安装与部署

Redis下载方法 最近部署项目的时候用到了Redis,自己在安装的时候也碰到了一些列问题最终安装成功,记录一下自己的安装历程。前期准备: 服务器Linux版本:Centos8.4 64位(http://isoredirect.centos.org/centos/8/isos/…

TS设置接收的形参类型

在我们使用pinia时会接受参数&#xff0c;一般来说是传递两个参数 setGlobalState(...args: ObjToKeyValArray<GlobalState>) {this.$patch({ [args[0]]: args[1] }); } 例如此时传递的是globalStore.setGlobalState("token", "123"); 那么此时的…

python姿态识别+Tensflow1.12+pyqt5+UI

python姿态识别Tensflow1.12pyqt5UI import datetimefrom PyQt5.QtCore import QCoreApplication from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog from vedio import vediofrom HumanPoseRec import Ui_MainWindow from PyQt5 import QtCore, QtGui, Qt…

如何使用Python提取Excel中固定单元格的内容

正文共&#xff1a;1234 字 31 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前转载了颜总的Python环境搭建文章&#xff08;Python办公自动化—环境搭建&#xff09;&#xff0c;很久过去了&#xff0c;颜总也没有再更新。现在我有一个需求&#xff0c;就是我手上有大量格…

Android Studio 下载 | 安装 | 下载 SDK | 中文插件 | 卸载

文章目录 下载安装包安装下载 SDK中文插件卸载 下载安装包 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 点击下载 Android Studio。 在协议最下方勾选同意&#xff08;第一次用最好还是看一眼&#xff09;&#xff0c;再点击 Dowload Android Stu…