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

目录

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

前言

快照读(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之间的读写冲突,提高了并发处理能力。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

水泥超低排平台改造全攻略!

在环保政策日益严格的背景下,水泥行业作为高污染、高能耗的行业之一,面临着巨大的改造压力。水泥超低排平台的改造不仅是响应国家环保号召的举措,更是企业实现绿色生产、可持续发展的必经之路。本文将详细解读水泥超低排平台改造的要点和策略…

Sketch语言设置指南:将英文版改成中文版的教程

Sketch版本的转换一直是困扰大家的关键问题。如今UI设计领域的UI设计软件很多,但大部分都是英文版。对于国内英语基础差的设计师来说,使用这样的软件无形中增加了工作量,往往需要在设计编辑的同时查阅翻译。即时设计详细介绍了Sketch英文版如…

C++容器之概览

目录 1 概述2 分类2.1 前向迭代器容器2.2 双向迭代器容器2.3 随机访问迭代器容器2.4 容器适配器2.5 位集 1 概述 在C标准库中容器是通过模板实现的数据结构,多数可以通过迭代器统一访问,包括: array 数组是固定大小的序列容器:它…

AH股冲高回落,微盘股指数收盘重挫6%,半导体板块继续走强,工业富联涨停

低价股、地产、商业航天等板块深度回调,ST股批量跌停;半导体板块逆势上扬,工业富联涨停;航运、贵金属股反弹。 周四,A股三大指数午后跌幅加剧,上证指数收跌0.54%,创业板指跌0.71%。沪深两市成交…

文件传输基础——Java IO流

系列文章目录 文章目录 系列文章目录前言一、文件的编码二、File类的使用三、RandomAccessFile类的使用 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用…

动态IP基础解析:为什么我们需要它?

在深入探讨互联网世界的运作机制时,IP地址无疑是其核心要素之一。IP地址,作为网络设备的唯一标识,不仅确保了数据的准确传输,更是网络安全和管理的基石。本文将深入解析动态IP的基础知识,并探讨其重要性及在多种场景下…

【协同感知】Collaborative Perception in Autonomous Driving数据集与论文整理

Collaborative Perception in Autonomous Driving 目前最全的Collaborative Perception整理数据集协同感知论文-【三维目标检测】现实世界下的协同感知理想条件下的协同感知 目前最全的Collaborative Perception整理 https://github.com/Little-Podi/Collaborative_Perception…

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本

在Jenkins 中使用 NVM 管理 Node.js 部署项目的自动化脚本 人生旅途,总有人不断地走来,有人不断地离去。当新名字变成老名字,当老的名字渐渐模糊,又是一个故事的结束和另一个故事的开始。 在现代软件开发中,持续集成/持…

【android】设置背景图片

改变值&#xff0c;可显示zai在 在theves下面的两个value都要增加名字代码 <item name"windowActionBar">false</item><item name"android:windowNoTitle">true</item><item name"android:windowFullscreen">tru…

《Navi日语社》App:日语学习与翻译的智能助手,支持日文OCR识别提取文字,无需打字对着说话就能翻译的日语语音翻译工具!

在全球化的今天&#xff0c;掌握一门外语已经成为许多人的必备技能。尤其是日语&#xff0c;不仅在学术、商务领域有着广泛的应用&#xff0c;也是许多旅行者和动漫爱好者的心头好。《Navi日语社》App&#xff0c;作为一款专为日语学习者和翻译需求者设计的移动应用&#xff0c…

书生·浦语大模型全链路开源体系-笔记作业4

XTuner 微调 LLM:1.8B、多模态、Agent 引自&#xff1a;Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHub 1. XTuner介绍 引自&#xff1a;欢迎来到 XTuner 的中文文档 — XTuner 0.1.18.dev0 文档 1.1. 什么是 XTuner &#xff1f; X…

四、Window整理右键扩展

一、桌面右键和文件右键扩展整理 简而言之整理下面图示内容 桌面右键&#xff1a; 对文件右键&#xff1a; 工具&#xff1a;火狐自带工具 二、新建扩展管理 简而言之整理下面图示内容 Win R输入regedit 寻找&#xff1a;计算机\HKEY_CURRENT_USER\Software\Microsof…

Padstack制作贴片和通孔焊盘

Padstack制作贴片和通孔焊盘 一、贴片焊盘制作 先选择SMD Pin&#xff0c;下面的pad geometry根据需求选择&#xff0c;一般是Circle和Rectangle&#xff0c;然后选择单位&#xff0c;mm制。 然后点击Design Layers&#xff0c;只需要修改Regular Pad常规焊盘就行&#xff0c…

【深度解析GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比&#xff1a;从GPT-3到GPT-4&#xff0c;再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力&#xff1a;GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

vscode运行Java utf-8文件中文乱码报错

问题现象 vscode 运行utf-8 java文,爆出如下错误 hello.java:5: &#xfffd;&#xfffd;&#xfffd;&#xfffd;: &#xfffd;&#xfffd;&#xfffd;&#xfffd;GBK&#xfffd;IJ&#xfffd;&#xfffd;&#xfffd;ӳ&#xfffd;&#xfffd;&#xfffd;ַ&a…

联想Y410P跑大模型

安装vs 2017 查看GPU版本 查看支持哪个版本的cuda windows cuda更新教程_cuda 12.0-CSDN博客 下载并安装cuda tookit 10.1 CUDA Toolkit 10.1 Update 2 Archive | NVIDIA Developer 找到下载的文件&#xff0c;安装 参考安装链接 Win10 Vs2017 CUDA10.1安装&#xff08;避坑…

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核

20240606更新Toybrick的TB-RK3588开发板在Android12下的内核 2024/6/6 10:51 0、整体编译&#xff1a; 1、cat android12-rk-outside.tar.gz* | tar -xzv 2、cd android12 3、. build/envsetup.sh 4、lunch rk3588_s-userdebug 5、./build.sh -AUCKu -d rk3588-toybrick-x0-a…

ArUco与AprilTag 标签

一、简介 在许多计算机视觉应用程序中&#xff0c;姿势估计非常重要&#xff1a;机器人导航&#xff0c;增强现实等等。 该过程基于发现真实环境中的点与其2d图像投影之间的对应关系。 这通常是一个困难的步骤&#xff0c;因此通常使用合成或基准标记来简化操作。 最受流行的…

Github Copilot登录账号,完美支持chat

Github Copilot 代码补全等功能&#xff0c;提高写代码的效率 https://web.52shizhan.cn/activity/copilot 登录授权后&#xff0c;已经可以使用&#xff0c;完美。如图

OpenCv之简单的人脸识别项目(动态处理页面)

人脸识别 准备九、动态处理页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义视频处理脚本4.定义相机抓取脚本5.定义关闭窗口的函数6.按钮设计6.1视频处理按钮6.2相机抓取按钮6.3返回按钮 7.定义关键函数8.动态处理…