首页 > 其他分享 >InnoDB MVCC——隐藏字段、Undolog、ReadView

InnoDB MVCC——隐藏字段、Undolog、ReadView

时间:2022-09-26 18:22:30浏览次数:46  
标签:事务 Undolog DB ID InnoDB 版本 ReadView id

和MVCC相关的三个东西

  • 隐藏字段:InnoDB表中的每个行前都有的三个隐藏字段,用于实现MVCC机制
  • undolog:用于记录数据的历史版本,每一个数据的历史版本在undolog中构成一个历史版本链
  • readview*:每个事务都有一个,用于确定它能读到链中的哪些历史版本

隐藏字段

通过这一小节,你将知道InnoDB为了实现MVCC机制,在数据行上做了什么,它添加了三个隐藏字段

  • DB_TRX_ID:最后对该行进行插入或修改的事务ID
  • DB_ROLL_PTR:回滚指针,指向该数据的上一个版本,用于维护历史版本链
  • DB_ROW_ID:隐藏主键,只有当表没设置主键时才有,它和MVCC也没啥关系

undolog

通过这一小节,你将知道undolog是如何保存一行数据的历史版本的,以及DB_ROLL_PTR如何构建版本链,为了简单,我们省略DB_ROW_ID

假设现在有这样一个表,它只有一个列A

  1. 事务1刚刚插入了一行,A=1

    img

  2. 事务2修改这一行,A=2

    1. 把该行数据拷贝到undolog
    2. 执行这个修改,设置DB_TRX_IDDB_ROLL_PTR

    img

  3. 事务3再修改这一行,A=6

    img

ReadView

通过这一小节,你将知道当一个事务进行快照读时,如何确定自己应该读取历史版本链中的哪个数据。

ReadView快照能够在事务的查询中帮助解决这个问题,快照中包含以下关键内容:

  1. m_ids:当前系统中活动(已经开始,尚未提交回滚)事务id列表,有序
  2. max_trx_id:下一个尚未分配的事务id
  3. min_trx_idm_ids列表中最小的一个id

然后,假如我们就拿可重复读的标准来考虑,并假设ReadView生成的时间就是当前查询事务开启的时间

  • 如果待查询数据的DB_TRX_ID < min_trx_id,因为该数据在ReadView快照生成时已经是提交过的了,直接使用就行
  • 如果待查询数据的DB_TRX_ID = 当前事务id,一个事务肯定能读到自己做的修改,直接使用就行
  • 如果待查询数据的DB_TRX_ID >= max_trx_id,那么该数据是ReadView生成时尚未提交过的,需要沿DB_ROLL_PTR访问undolog的历史版本链,找到该读的数据
  • 还有种可能是DB_TRX_ID属于[min_trx_id, max_trx_id)这个区间
    • 如果DB_TRX_ID在列表中,说明它在ReadView创建时还未提交,不能使用,需要访问历史版本链
    • 否则,它在ReadView创建时已经提交,直接访问该数据

如果给事务一个ReadView,让事务按上面的规则进行读取,那么事务就能读取到ReadView生成时已经提交的最新版本数据

众所周知,MVCC机制支持在Read CommittedRepeatable Read级别下工作,那么我们只需要控制生成ReadView的时机,就可以模拟出这两种隔离级别应有的读取行为

  • Read Committed级别时,每次遇到读取命令生成一个ReadView
  • Repeatable Read级别时,第一次遇到读取命令生成一个ReadView,并且该ReadView在整个事务中共享

标签:事务,Undolog,DB,ID,InnoDB,版本,ReadView,id
From: https://www.cnblogs.com/lilpig/p/16731925.html

相关文章

  • linux 启动mysql失败 InnoDB: Table flags are 0 in the data dictionary but the fla
    linux启动mysql失败,报错日志文件里的报错信息InnoDB:Tableflagsare0inthedatadictionarybuttheflagsinfile./ibdata1are0x4800!执行 sudosystemctl......
  • MySQL InnoDB 锁的二三事
    近日, 在一个小型项目中, 遇到了一个触及我知识盲区的bug. 项目用的是MySQL5.7.25, 其中有一张表 config_data,包含四个字段,id,name,value,expireAt.其中id......
  • MySQL存储引擎中的MyISAM和InnoDB区别详解
    MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(IndexedSequentialAccessMethod:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transacti......
  • MyISAM与InnoDB 的区别(9个不同点)
    区别:1.InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;2.InnoDB......
  • InnoDB数据页结构
    InnoDB为了不同的目的而设计了许多种不同种类的页,页是InnoDB存储引擎管理数据库的最小磁盘单位,默认每个页的大小为16KB; InnoDB数据页结构InnoDB数据页由以下7个部分组......
  • MySQL架构原理之存储引擎InnoDB存储结构
    从MySQL5.5版本开始默认使用InnoDB作为引擎,它擅长处理事务,具有自动奔溃恢复的特性,在日常开发中使用非常广泛。其具体架构,参考官方提供的相关图示如下:从......
  • 【Mysql】MyISAM 和 InnoDB 的区别
    先看下《高性能MySQL》中对于他们的评价:InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的......
  • InnoDB关键特性之double write (转)
    一、脏页刷盘风险原文地址:https://www.cnblogs.com/geaozhang/p/7241744.html关于IO的最小单位:1、数据库IO的最小单位是16K(MySQL默认,oracle是8K)2、文件系统......
  • MySQL InnoDB索引原理
     数据库与I/O原理数据会持久化到磁盘,查询数据是就会有I/O操作,相对于缓存操作,I/O操作的时间成本相当高昂。I/O操作的基本单位是一个磁盘页面,比如16KB的页面大小。当数据......
  • innodb buffer pool简介
    一、InnodbBufferPool简介BufferPool是Innodb内存中的的一块占比较大的区域,用来缓存表和索引数据。众所周知,从内存访问会比从磁盘访问快很多。为了提高数据的读取速......