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

news2024/10/5 17:18:16

目录

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

前言

快照读(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.coloradmin.cn/o/1794032.html

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

相关文章

hadoop疑难问题解决_NoClassDefFoundError: org/apache/hadoop/fs/adl/AdlFileSystem

1、问题描述 impala执行查询:select * from stmta_raw limit 10; 报错信息如下: Query: select * from sfmta_raw limit 10 Query submitted at: 2018-04-11 14:46:29 (Coordinator: http://mrj001:25000) ERROR: AnalysisException: Failed to load …

关于一些优化的知识

1、凸优化:一定可找到全局最优解 非凸优化:一般是局部最优解 2、无约束优化问题求解方法:梯度下降、拟牛顿法、高斯牛顿法、LM算法 3、 解释,就是右边的式子对应于就是当前这个xk这个点基础上朝着pk取走步长为a得到了对应的值&…

什么是Vector Database(向量数据库)?

什么是Vector Database(向量数据库)? 向量数据库是向量嵌入的有组织的集合,可以随时创建、读取、更新和删除。向量嵌入将文本或图像等数据块表示为数值。 文章目录 什么是Vector Database(向量数据库)?什么是嵌入模型(Embedding Model)&…

618精选好物盘点!五款必买力作合集,省钱又实用!

随着夏日的脚步越来越近,618购物节也如期而至,成为消费者们期待的年度购物盛宴。在这个全民狂欢的日子里,各种精选好物层出不穷,无论是追求高品质生活的你,还是希望提升日常效率的上班族,都能在这一天找到心…

【微服务】使用kubekey部署k8s多节点及kubesphere

kubesphere官方部署文档 https://github.com/kubesphere/kubesphere/blob/master/README_zh.md kubuctl命令文档 https://kubernetes.io/zh-cn/docs/reference/kubectl/ k8s资源类型 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E…

QT_UI设计

mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE //命名空间 namespace Ui { class MainWindow; } //ui_MainWindow文件里定义的类&#xff0c;外部声明 QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_O…

读书笔记-《软件定义安全》之一:SDN和NFV:下一代网络的变革

第1章 SDN和NFV&#xff1a;下一代网络的变革 1.什么是SDN和NFV 1.1 SDN/NFV的体系结构 SDN SDN的体系结构可以分为3层&#xff1a; 基础设施层由经过资源抽象的网络设备组成&#xff0c;仅实现网络转发等数据平面的功能&#xff0c;不包含或仅包含有限的控制平面的功能。…

debian支持中文

1. 安装依赖 apt-get install locales2. 设置字符集 dpkg-reconfigure locales 选择en_us.UF-8&#xff0c;其余全部取消 3.设置生效&#xff0c;无需重启系统 source /etc/default/locale 4. 查看是否生效 locale

高效内容分发:海外短剧推广平台的流媒体传输技术挑战与解决

随着海外短剧市场的蓬勃发展&#xff0c;如何高效地将短剧内容分发给全球观众成为了推广平台必须面对的一大挑战。在这一过程中&#xff0c;流媒体传输技术起着至关重要的作用。然而&#xff0c;由于网络环境的复杂性和多样性&#xff0c;流媒体传输面临着带宽限制、延迟等诸多…

(学习笔记)数据基建-元数据管理

&#xff08;学习笔记&#xff09;数据基建-元数据管理 什么是元数据元数据该如何管理工具化规范化 数据血缘 什么是元数据 简单来说就是描述数据的数据&#xff0c;更直白来说就是描述表名、表制作者、表字段、表生命周期、表存粗等信息的数据 元数据该如何管理 工具化 …

【备战蓝桥杯】蓝桥杯省一笔记:算法模板笔记(Java)

蓝桥杯 0、快读快写模板1、回文判定2、前缀和3、差分4、二分查找5、快速幂6、判断素数7、gcd&lcm8、进制转换9、位运算10、字符串常用API11、n的所有质因子12、n的质因子个数13、n的约数个数14、n阶乘的约数个数15、n的约数和16、阶乘 & 双阶乘17、自定义升序降序18、动…

Docker安装、使用,容器化部署springboot项目

一、使用官方安装脚本自动安装 安装命令如下&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令&#xff1a; curl -sSL https://get.daocloud.io/docker | sh 二、Docker离线安装 1. 下载安装包 可…

【android】设置背景图片

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

一、【源码】创建简单的映射器代理工厂

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/01-xxxDao-proxy 创建简单的映射器代理工厂 执行xxxDao.method()时都做了些什么&#xff1f; 原理是&#xff1a;首先定义Dao接口&#xff…

docker 停止重启容器命令start/stop/restart详解(容器生命周期管理教程-2)

Docker 提供了多个命令来管理容器的生命周期&#xff0c; 其中start、stop 和 restart。这些命令允许用户控制容器的运行状态。 1. docker start 命令格式&#xff1a; docker start [OPTIONS] CONTAINER [CONTAINER...]功能&#xff1a; 启动一个或多个已经停止的 Docker …

【Qt系列教程】一、认识Qt、安装Qt、运行Hello Qt

文章目录 1.1 Qt 简介1.2 Qt 的安装1.3 编写 Hello World 1.1 Qt 简介 Qt&#xff08;官网&#xff1a;https://www.qt.io&#xff09;于1995年5月首次公开发布&#xff0c;是一个跨平台的应用程序开发框架&#xff0c;也是最主流的 C 开发框架&#xff1b; Qt 具有其他编程…

[XYCTF新生赛]-Reverse:ez_rand解析(爆破时间戳,汇编结合反汇编)

无壳 查看ida 这里是利用time64获取种子&#xff0c;但是time64不是标准的函数&#xff0c;这里是伪随机数&#xff0c;简单地来说就是它不是通过时间来确定种子&#xff0c;所以我们没办法在脚本里直接调用它得到种子&#xff0c;那就意味着我们不知道种子是多少&#xff0c;…

一个好用的对外开放端口工具 Ngrok

工作中我们经常需要在测试或者开发阶段给客户快速展示程序&#xff0c;需要运维打开端口、部署等一系列操作&#xff0c;成本较高。如果能够直将本地开发环境发布给客户直接进行体验、需求确认&#xff0c;就会方便很多&#xff0c;本文将介绍一个小工具可以快速对外打开端口。…

Docker笔记-解决非交互式运行python时print不输出的问题

换句话来说就是在docker中如何不会python的print 只需要在启动时&#xff0c;不让python缓冲其输出。 关键命令如下&#xff1a;PYTHONUNBUFFERED1 如下&#xff1a; docker run -e PYTHONUNBUFFERED1 <your_image> 下面解释下-e "-e"选项的全称是"…

冯喜运:6.6外汇黄金原油晚间行情预测及独家操作建议

【黄金消息面分析】&#xff1a;周三&#xff08;6月5日&#xff09;&#xff0c;黄金价格继续区间波动并上涨&#xff0c;与周二的价格走势形成鲜明对比&#xff0c;此前美国公布的经济数据好坏参半&#xff0c;可能促使美联储降低借贷成本。美国国债收益率下降&#xff0c;美…