iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MVCC中快照怎么工作的
  • 874
分享到

MVCC中快照怎么工作的

2024-04-02 19:04:59 874人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关mvcC中快照怎么工作的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MVCC在 Mysql 中(innodb存储引擎),实际上每条记录在更新

这篇文章将为大家详细讲解有关mvcC中快照怎么工作的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

MVCC

Mysql 中(innodb存储引擎),实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。

MVCC中快照怎么工作的

当前值是 4,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 read-view。如图中看到的,在视图 A、B、C 里面,这一个记录的值分别是 1、2、4,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 read-view A,要得到 1,就必须将当前值依次执行图中所有的回滚操作得到。

InnoDB 是怎么定义一个 ‘快照’

InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnoDB 的事务系统申请的,是按申请顺序严格递增的。

而每行数据也都是有多个版本的。每次事务更新数据的时候,都会生成一个新的数据版本,并且把 transaction id 赋值给这个数据版本的事务 ID,记为 row trx_id。同时,旧的数据版本要保留,并且在新的数据版本中,能够有信息可以直接拿到它。

也就是说,数据表中的一行记录,其实可能有多个版本 (row),每个版本有自己的 row trx_id。

MVCC中快照怎么工作的

按照可重复读的定义,一个事务启动的时候,能够看到所有已经提交的事务结果。但是之后,这个事务执行期间,其他事务的更新对它不可见。

因此,一个事务只需要在启动的时候声明说,“以我启动的时刻为准,如果一个数据版本是在我启动之前生成的,就认;如果是我启动以后才生成的,我就不认,我必须要找到它的上一个版本”。当然,如果“上一个版本”也不可见,那就得继续往前找。还有,如果是这个事务自己更新的数据,它自己还是要认的。

在实现上, InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。“活跃”指的就是,启动了但还没提交。

数组里面事务 ID 的最小值记为低水位,当前系统里面已经创建过的事务 ID 的最大值加 1 记为高水位。

这个视图数组把所有的 row trx_id 分成了几种不同的情况。

MVCC中快照怎么工作的

这样,对于当前事务的启动瞬间来说,一个数据版本的 row trx_id,有以下几种可能:

  • 如果落在绿色部分,表示这个版本是已提交的事务或者是当前事务自己生成的,这个数据是可见的;

  • 如果落在红色部分,表示这个版本是由将来启动的事务生成的,是肯定不可见的;

  • 如果落在黄色部分,那就包括两种情况

a. 若 row trx_id 在数组中,表示这个版本是由还没提交的事务生成的,不可见;
b. 若 row trx_id 不在数组中,表示这个版本是已经提交了的事务生成的,可见。

举个例子:

session A 启动了一个事务A, 在事务 A 开始前,系统里面分别有三个活跃事务,ID分别 是90 93 95 。
那么事务A的ID是100
此时对于事务A的视图数组是这样的 【90 93 95 100】,其中 低水位是 90, 高水位是100+1=101;
现在事务A开始读数据了

  • 假如读到了ID是104的,大于高水位101,表示这个版本是由将来启动的事务生成的,是肯定不可见的;

  • 读到了ID是88的,小于低水位90,表示这个版本是已提交的事务或者是当前事务自己生成的,这个数据是可见的;

  • 读到了ID是94的,在低水位和高水位之间,但是不在【90 93 95 100】这个数组里,表示这个版本是已经提交了的事务生成的,可见。

  • 读到了ID是93的,在低水位和高水位之间,这【90 93 95 100】这个数组里,表示这个版本是由还没提交的事务生成的,不可见;

这个判断规则是从代码逻辑直接转译过来的,但是正如你所见,用于人肉分析可见性很麻烦。

所以,我来给你翻译一下。一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:

  • 版本未提交,不可见;

  • 版本已提交,但是是在视图创建后提交的,不可见;

  • 版本已提交,而且是在视图创建前提交的,可见。

关于“MVCC中快照怎么工作的”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MVCC中快照怎么工作的

本文链接: https://www.lsjlt.com/news/72508.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MVCC中快照怎么工作的
    这篇文章将为大家详细讲解有关MVCC中快照怎么工作的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MVCC在 MySQL 中(innodb存储引擎),实际上每条记录在更新...
    99+
    2024-04-02
  • PostgreSQL DBA(24) - MVCC#4(快照中的xmax)
    本节通过源码解释了snapsho...
    99+
    2024-04-02
  • InnoDB MVCC的工作原理是什么
    这篇文章给大家分享的是有关InnoDB MVCC的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。InnoDB 的 MVCC,是通过在每行记录后面保存两个隐藏的列实现...
    99+
    2024-04-02
  • 【MySQL】MVCC是如何解决快照读下的幻读问题的
    文章目录 LBCC当前读 MVCC隐藏列undo logRead View 总结 我们从上文中了解到InnoDB默认的事务隔离级别是repeatable read(后文中用简称RR),它为了解决该隔离级别下的幻读的并发问...
    99+
    2023-08-17
    mysql 数据库 java mvcc 快照读
  • mysql中MVCC的作用是什么
    本篇文章为大家展示了mysql中MVCC的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、说明多版并发控制MVCC是MySQL InnoDB存储引擎实现隔离等级的具体方法,用于实现提交阅...
    99+
    2023-06-15
  • linux中怎样使用快照制作虚拟机
    linux中怎样使用快照制作虚拟机,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在日常的学习当中,如果遇到了集群和负载均衡类的实验,需要用到大量的虚拟机,如果一个一个的去创建,...
    99+
    2023-06-16
  • 云服务器的快照是什么作用?
    云服务器快照功能的作用有以下几个方面: 快速备份:云服务器快照功能可以将服务器上的数据快速备份到另外一个地方,避免了因数据丢失或损坏而导致的数据不可用或备份不完整的情况。 方便恢复:云服务器快照功能可以快速地恢复服务器上的数据,避免了因...
    99+
    2023-10-27
    快照 作用 服务器
  • 云服务器的快照有什么作用
    云服务器快照的作用有:1.防止误删,通过快照回滚恢复;2.防止勒索攻击,减少经济损失;3.定期数据备份;4.临时数据备份;具体分析如下:防止误删如果用户误操作,不小心删了系统文件,可以通过快照回滚将其迅速恢复。防止勒索攻击当网站被勒索软件加...
    99+
    2024-04-02
  • redis怎么开启rdb快照
    redis开启rdb快照的示例:在redis.conf中创建快照的配置如下:# 时间策略save 900 1save 300 10save 60 10000# ...
    99+
    2024-04-02
  • 怎么理解MySQL中的MVCC
    这篇文章将为大家详细讲解有关怎么理解MySQL中的MVCC,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。关系数据库管理系统使用MVCC(Multiversi...
    99+
    2024-04-02
  • mysql的mvcc有什么作用
    MySQL的MVCC(Multi-Version Concurrency Control)是一种并发控制机制,它在读取和写入数据时,...
    99+
    2024-04-24
    mysql MVCC
  • 浅谈Redis中的RDB快照
    目录一、概述二、快照怎么用?三、执行 bgsava 快照时,数据能被修改吗?四、RDB 和 AOF 合体一、概述 所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬...
    99+
    2024-04-02
  • oracle怎么查看表快照
    要查看Oracle数据库中的表快照,可以使用以下方法:1. 使用DBA视图:可以使用以下查询语句来查看表快照的信息:```SELEC...
    99+
    2023-08-26
    oracle
  • MVCC 在RC 和 RR 隔离等级下的工作机制
    一.数据行隐藏列 innodb为每行记录都实现了三个隐藏字段 6字节的事务ID(DB_TRX_ID) 7字节的回滚指针(DB_ROLL_PTR) 隐藏的ID 事务1修改行值过程: X锁锁定该行 ...
    99+
    2024-04-02
  • linux快照指的是什么
    本篇内容介绍了“linux快照指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在linux中,快照是文件系统状态的只读时间点副本,是...
    99+
    2023-06-30
  • 怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
    快照布局的作用 win11系统宣布了新的“快照布局”,通过“最大化”按钮为用户提供各种窗口布局选项, 以便用户可以从多个布局模板中进行选择,以在屏幕上显示两个、三个或四个打...
    99+
    2023-05-23
    Windows11 禁用快照布局 快照布局 win11
  • oracle快照功能怎么使用
    Oracle数据库的快照功能允许用户创建数据库对象的快照,以便可以在不修改原始数据的情况下对其进行分析和查询。以下是使用Oracle...
    99+
    2024-04-09
    oracle
  • mysql的mvcc怎么使用
    MySQL的MVCC(Multi-Version Concurrency Control)是一种用于管理并发事务的机制,它可以在不同...
    99+
    2024-04-24
    mysql MVCC
  • 亚马逊服务器快照怎么弄的
    使用API或SDK,向API或SDK注册,然后获取服务器快照。 使用JavaScript,在服务器上获取快照文件,可以使用fgets或其他JavaScript库来实现。 使用HTTP协议,向Web服务器发送HTTP请求,获取服务器快照。 ...
    99+
    2023-10-27
    亚马逊 快照 怎么弄
  • NAS怎么使用SnapShot快照功能
    本篇文章为大家展示了NAS怎么使用SnapShot快照功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Snapshot是基于Btrfs文件系统产生的快速备份和还原数据的第三方应用,利用Snapsh...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作