千家信息网

MVCC中快照怎么工作的

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章将为大家详细讲解有关MVCC中快照怎么工作的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MVCC在 MySQL 中(innodb存储引擎),实际上每条记录
千家信息网最后更新 2025年01月19日MVCC中快照怎么工作的

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

MVCC

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

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

当前值是 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。

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

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

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

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

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

这样,对于当前事务的启动瞬间来说,一个数据版本的 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中快照怎么工作的"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

事务 版本 数据 生成 水位 数组 时候 视图 是在 更新 是由 系统 快照 不同 多个 情况 篇文章 部分 工作 之间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 厦门搞网络安全的软件公司 鬼泣手游服务器人数上限咋办 华为存储软件开发 直播软件开发外包公司排名 安卓手机云控软件开发商 单位网络安全管理细则 网络安全的危害政治 斗神再临华为服务器 中国数据库技术行列 我的世界服务器清除地面方块指令 公安机关网络安全各项规章制度 光明区品质网络技术开发动态 安徽服务器系统托管云主机 深圳大学生网络安全学院 winccc脚本调用数据库 oracle数据库详细查询语句 湖南软件开发培训哪里比较好 vb读数据库数据 软件开发课题结题报告ppt流程 关系数据库字段取值范围 软件开发文件综述 小米笔记本pro 软件开发 软件开发人员工资免税 网络安全责任制度落实情况 软件开发招聘信息中熟练是指 戴尔服务器更改开机第一启动项 pop3对服务器邮件的默认操作 张店mes软件开发公司 多重网络安全吗 iis配置web服务器
0