iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >InnoDB秒级快照原理是什么
  • 959
分享到

InnoDB秒级快照原理是什么

2024-04-02 19:04:59 959人浏览 薄情痞子
摘要

这篇文章主要介绍“InnoDB秒级快照原理是什么”,在日常操作中,相信很多人在InnoDB秒级快照原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB秒级快照

这篇文章主要介绍“InnoDB秒级快照原理是什么”,在日常操作中,相信很多人在InnoDB秒级快照原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB秒级快照原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

InnoDB秒级快照原理是什么

开始事务的两种方式

需要注意的是:begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB  表的语句,事务才真正启动。 如果你想要马上启动一个事务,可以使用transaction with consistent snapshot 这个命令!

第一种启动方式,一致性视图是在第执行第一个快照读语句时创建的;

第二种启动方式,一致性视图是在执行 start transaction with consistent snapshot 时创建的;

事务 C 没有显式地使用 begin/commit,表示这个 update 语句本身就是一个事务,语句完成的时候会自动提交。事务 B 在更新了行之后查询  ; 事务 A 在一个只读事务中查询,并且时间顺序上是在事务 B 的查询之后。但是结果却是:事务 B 查到的 k 的值是 3,而事务 A 查到的 k 的值是  1

InnoDB秒级快照原理是什么

按照我们想象的情况应该是如下所示:

InnoDB秒级快照原理是什么

最终得到的结果是事务A查询的结果为1,事务B查询的结果是2,但是为什么事务B查询后为3呢??

需要注意的是,在 Mysql 里,有两个视图的概念:

1、一个是view,它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 create view …  ,而它的查询方法与表一样。

2、另一个是 InnoDB 在实现 mvcC(Multi-Version Concurrency Control,多版本并发控制)时用到的一致性读视图,即  consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable  Read,可重复读)隔离级别的实现。

InnoDB创建秒级快照原理

本文的首图即是MVCC的实现原理,在可重复读隔离级别下,事务在启动的时候就”拍了个快照”。注意,这个快照是基于整库的。如果一个库有  100G,那么我启动一个事务,mysql就要拷贝 100G 的数据出来,这个过程得多慢啊。可是平时的事务执行起来很快啊,实际上,我们并不需要拷贝出这 100G  的数据。我们先来看看这个快照是怎么实现的:

InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnoDB  的事务系统申请的,是按申请顺序严格递增的。而每行数据也都是有多个版本的。每次事务更新数据的时候,都会生成一个新的数据版本,并且把 transaction id  赋值给这个数据版本的事务 ID,记为 row  trx_id。同时,旧的数据版本要保留,并且在新的数据版本中,能够有信息可以直接拿到它。也就是说,数据表中的一行记录,其实可能有多个版本  (即row中的每个数据),每个版本有自己的 row trx_id。

如所示,就是一个记录被多个事务连续更新后的状态。

InnoDB秒级快照原理是什么

图中的三个虚线箭头,就是 undo log(回滚日志);而 V1、V2、V3 并不是物理上真实存在的,而是每次需要的时候根据当前版本和 undo log  计算出来的。比如,需要 V2 的时候,就是通过 V4 依次执行 U3、U2 算出来。

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

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

在实现上, InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正处于启动了但还没提交的所有事务ID。数组里面事务 ID  的最小值记为低水位,当前系统里面已经创建过的事务 ID  的最大值加1记为高水位。这个视图数组和高水位,就组成了当前事务的一致性视图(read-view)而数据版本的可见性规则,就是基于数据的 row trx_id  和这个一致性视图的对比结果得到的。这个视图数组把所有的 row trx_id 分成了几种不同的情况:

InnoDB秒级快照原理是什么

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

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

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

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

  • 若 row trx_id 在数组中,表示这个版本是由还没提交的事务生成的,不可见;

  • 若 row trx_id 不在数组中,表示这个版本是已经提交了的事务生成的,可见。

重点要理解落在黄色部分的两种情况,一条数据被多个事物更新(事务还未提交),那么肯定在数组中含有row  trx_id,即这个版本是由还没提交的事务生成的

所以InnoDB如何秒级创建快照的呢?我的总结如下:

1、事务开启时InnoDB会赋给事务一个ID,为了方便我们直接叫做事务ID

2、表中每行数据有多个版本,A事务更新数据的时候,都会生成一个新的数据版本,并且把A事务的事务ID赋值给这个数据版本的事务ID

3、通过回滚日志来计算事务ID对应的数据版本,比如A事务更新了  id=1的数据的value为1,那么就存在id=1那一条数据的新版本,(id=1,value=1)这一条数据对应的事务ID就是A事务的事务ID

4、如果一个数据版本的事务ID落在黄色部分并且还在事务数组中就判定此数据版本是其他未提交事务对数据修改产生的数据新版本;如果一个数据版本的事务ID落在黄色部分并且不在自己的事务数组中,那么说明事务已经提交,是合法数据

所以InnoDB的秒级快照的创建能力的原理无非和linux的AUFS文件系统如出一撤,那就是你只要改了某一条数据,我就复制那一条让你改,并且不会影响其他人的数据:

InnoDB秒级快照原理是什么

都是”当前读”惹的祸

我们在明白了InnoDB如何实现的创建秒级快照的原理后,开篇的疑惑其实很好解答:

我们不妨做如下假设,事务 A 开始前,系统里面只有一个活跃事务 ID 是 99;事务 A、B、C 的版本号分别是  100、101、102,且当前系统里只有这四个事务;三个事务开始前,(1,1)这一行数据的 row trx_id 是 90

这样,事务 A 的视图数组就是 [99,100],事务 B 的视图数组是 [99,100,101],事务 C 的视图数组是  [99,100,101,102]。

InnoDB秒级快照原理是什么

这其实就很容易理解了,事务C发现,此时的已开启事务但是未提交的有四个(99,100,101,102),由于其他事务还并未对id=1这条数据进行修改,所以此时只有一个版本那就是(id=1,  k=1,事务ID=90),并且90号事务ID处于低水位,说明事务ID为90的事务已经提交了,数据有效,随后事务C把k置为了2,并且提交了事务,所以此时生成了新版本(id=1,k=2,事务ID为102)

最后A事务去查询k的值,发现已经有三个版本了,当A事务看到最新版本(id=1,k=3,事务ID为101)的数据时,发现101在高水位,不能读到,接着读到版本为(id=1,k=2,事务ID为102)时候同样事务102也是高水位,不能读到,继续读,读到(id=1,k=1,事务ID为90)的版本的数据,事务ID为90的事务处于低水位,数据时可见的,于是得到的数据依旧是(id=1,  k=1, 事务ID为90)的数据版本

问题来了?事务B是如何看到事务C的修改结果的??对于事务B来说,事务C不是高水位吗?按道理应该不可见高水位事务的修改呀!!!

事务 B 的视图数组是先生成的,之后事务 C 才提交,不是应该看不见 (1,2)吗,怎么能算出 (1,3) 来?

InnoDB秒级快照原理是什么

是的,如果事务 B 在更新之前查询一次数据,这个查询返回的 k 的值确实是 1。但是,当它要去更新数据的时候,就不能再在历史版本上更新了,否则事务 C  的更新就丢失了。因此,事务 B 此时的 set k=k+1 是在(1,2)的基础上进行的操作。所以,这里就用到了这样一条规则:

更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read)。

因此,在更新的时候,当前读拿到的数据是 (1,2),更新后生成了新版本的数据 (1,3),这个新版本的 row trx_id 是 101。所以,在执行事务  B 查询语句的时候,一看自己的版本号是 101,最新数据的版本号也是101,是自己的更新,可以直接使用,所以查询得到的 k 的值是 3。

但是select的结果却是1,所以我们队开始的例子稍做修改,让更新的时候值不在是k=k+1,这样就避免了当前读,所以下面的例子就是避免的当前读所产生的结果:

InnoDB秒级快照原理是什么

因为在MYsql中:不能在同一表中查询的数据作为同一表的更新数据,所以我这里使用了临时表

其实,除了 update 语句外,select 语句如果加,也是当前读。

现在假设事务 C 不是马上提交的,而是变成了下面的事务 C’,会怎么样呢?

InnoDB秒级快照原理是什么

事务 C’的不同是,更新后并没有马上提交,在它提交前,事务 B 的更新语句先发起了。前面说过了,虽然事务 C’还没提交,但是 (1,2)  这个版本也已经生成了,并且是当前的最新版本。那么,事务 B 的更新语句会怎么处理呢?。

事务 C’没提交,也就是说 (1,2) 这个版本上的写锁还没释放。而事务 B 是当前读,必须要读最新版本,而且必须加锁,因此就被锁住了,必须等到事务 C’  释放这个锁,才能继续它的当前读。

InnoDB秒级快照原理是什么

到这里,我们把一致性读、当前读和行锁就串起来了。

可重复读的实现

可重复读的核心就是一致性读(consistent  read);而事务更新数据的时候,只能用当前读。如果当前的记录的行锁被其他事务占用的话,就需要进入锁等待。

而读提交的逻辑和可重复读的逻辑类似,它们最主要的区别是:在可重复读隔离级别下,只需要在事务开始的时候创建一致性视图,之后事务里的其他查询都共用这个一致性视图;在读提交隔离级别下,每一个语句执行前都会重新算出一个新的视图。

InnoDB 的行数据有多个版本,每个数据版本有自己的 row trx_id,每个事务或者语句有自己的一致性视图。普通查询语句是一致性读,一致性读会根据  row trx_id  和一致性视图确定数据版本的可见性。对于可重复读,查询只承认在事务启动前就已经提交完成的数据;对于读提交,查询只承认在语句启动前就已经提交完成的数据;而当前读,总是读取已经提交完成的最新版本。

到此,关于“InnoDB秒级快照原理是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: InnoDB秒级快照原理是什么

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

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

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

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

下载Word文档
猜你喜欢
  • InnoDB秒级快照原理是什么
    这篇文章主要介绍“InnoDB秒级快照原理是什么”,在日常操作中,相信很多人在InnoDB秒级快照原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”InnoDB秒级快照...
    99+
    2024-04-02
  • InnoDB底层原理是什么
    这篇文章主要为大家展示了“InnoDB底层原理是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“InnoDB底层原理是什么”这篇文章吧。InnoDB,是MySQL的数据库引擎之一,现为MySQ...
    99+
    2023-06-27
  • MySQL InnoDB之MVCC原理是什么
    今天小编给大家分享一下MySQL InnoDB之MVCC原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面...
    99+
    2024-04-02
  • InnoDB MVCC的工作原理是什么
    这篇文章给大家分享的是有关InnoDB MVCC的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。InnoDB 的 MVCC,是通过在每行记录后面保存两个隐藏的列实现...
    99+
    2024-04-02
  • PHP秒杀的原理是什么
    PHP秒杀的原理可以概括为以下几个步骤: 用户请求:用户在页面上点击秒杀按钮或通过其他方式发起秒杀请求。 排队:当用户发起秒...
    99+
    2023-10-28
    PHP
  • mysql中innodb索引原理是什么
    这篇文章主要介绍了mysql中innodb索引原理是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。聚集索引(clustered index)...
    99+
    2024-04-02
  • innodb事务实现原理是什么
    InnoDB事务实现原理是通过使用多版本并发控制(MVCC)和日志重做(Redo)来确保事务的原子性、一致性、隔离性和持久性。1. ...
    99+
    2023-09-15
    innodb
  • MySQL中 Innodb索引的原理是什么
    本篇文章给大家分享的是有关MySQL中 Innodb索引的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是索引?索引(index...
    99+
    2024-04-02
  • innodb联合索引的原理是什么
    InnoDB联合索引的原理是将多个列的值组合起来作为索引的键,并按照指定的顺序进行排序和存储。它使用B+树数据结构来实现索引存储和查...
    99+
    2023-10-27
    innodb
  • linux快照指的是什么
    本篇内容介绍了“linux快照指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在linux中,快照是文件系统状态的只读时间点副本,是...
    99+
    2023-06-30
  • MySQL中InnoDB数据页的原理是什么
    MySQL中InnoDB数据页的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。不同类型的页简介它是InnoDB管理存储空间的基本单位...
    99+
    2024-04-02
  • 云服务器快照是什么
    云服务器快照是服务器提供商提供的云服务器数据备份方式,用于恢复因机器故障或人为误操作等而丢失的数据。快照技术是源于摄影技术,它记录的是当前时间点的影像内容;应用到云计算存储领域,就衍生出了快照技术,即在某一时间点上、对某一特定磁盘的数据进行...
    99+
    2024-04-02
  • MongoDB比Mysql快的原理是什么
    这篇文章主要讲解了“MongoDB比Mysql快的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB比Mysql快的原理是什么”吧!数据...
    99+
    2023-03-09
    mongodb mysql
  • web前端中影响网站快照的五个原因是什么
    本篇文章为大家展示了web前端中影响网站快照的五个原因是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。网站快照是一种缓存处理,为了方便用户。网站快照,目前大概有...
    99+
    2024-04-02
  • oracle快照刷新的步骤是什么
    Oracle快照刷新的步骤如下:1. 检查当前的快照刷新状态:使用以下命令查询当前快照刷新是否已启用:```SELECT n...
    99+
    2023-09-25
    oracle
  • 高德地图读秒红绿灯原理是什么
    高德地图读秒红绿灯原理是:1、通过高德地图的实时交通数据实现的;2、利用其强大的算法和人工智能技术,对收集到的交通数据进行处理和分析;3、根据路口的车辆流量、交通拥堵情况等素进行预测和计算,从而提供更准确的红绿灯剩余时间;4、根据用户的位置...
    99+
    2023-07-28
  • 秒换ip服务器的实现原理是什么
    秒换IP服务器的实现原理是在服务器端维护一个IP地址池,通过不断地轮流分配IP地址,使得客户端的IP地址不断变化,从而达到隐藏客户端...
    99+
    2023-06-08
    秒换ip服务器 服务器
  • 云服务器快照备份是什么
    云服务器快照备份是什么?云服务器快照备份是一种在云计算环境中常用的数据保护手段。当云服务器运行一段时间后,我们通常需要对其进行备份,以保证数据的安全性和可恢复性。而云服务器快照备份便是其中一种常见的备份方式。快照备份是通过对云服务器磁盘的...
    99+
    2024-01-24
    云服务器备份 云服务器快照 云服务器快照备份 云服务器快照备份是什么 云服务器知识
  • oracle快照刷新的方法是什么
    Oracle数据库中刷新快照的方法有以下几种:1. 刷新快照日志:使用ALTER SESSION语句刷新当前会话的快照日志。例如:A...
    99+
    2023-08-26
    oracle
  • innodb默认事务隔离级别是什么
    InnoDB存储引擎默认的事务隔离级别是REPEATABLE READ(可重复读)。在这个隔离级别下,事务在启动时会创建一个快照,用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作