首页 > 其他分享 >(十二)MVCC

(十二)MVCC

时间:2022-08-24 17:22:52浏览次数:84  
标签:事务 Read 十二 ID trx MVCC id View

MVCC:多版本并发控制技术。保存数据的历史版本。这样我们就可以通过比较版本号决定数据是否显示出来。

InnoDB中的RC和RR隔离事务是基于多版本并发控制(MVCC)实现高性能事务。一旦数据被加上排他锁,其他事务将无法加入共享锁,且处于阻塞等待状态,如果一张表有大量的请求,这样的性能将是无法支持的;MVCC对普通的 Select 不加锁,如果读取的数据正在执行Delete或Update操作,这时读取操作不会等待排它锁的释放,而是直接利用MVCC读取该行的数据快照。

事务版本号

每开启一个事务,我们都会从数据库中获得一个事务ID(也就是事务版本号),这个事务ID是自增长的,通过ID大小,我们就可以判断事务的时间顺序。

InnoDB的叶子节点存储的内容

  • row_id:隐藏的行ID,用来生成默认聚集索引。如果我们创建数据表的时候没有指定聚集索引,这时InnoDB就会用这个隐藏ID来创建聚集索引。采用聚集索引的方式可以提升数据的查找效率。
  • trx_id:操作这个数据的事务ID,也就是最后一个对该数据进行更新的事务ID
  • roll_ptr:回滚指针,也就是指向这个记录的Undo Log信息

Undo log

InnoDB将行数据快照保存在了Undo Log里。回滚指针将数据行的所有快照记录都通过链表的结构串联了起来,每个快照的记录都保存了当时的trx_id,也是那个时间点操作这个数据的事务ID。这样如果我们想要找历史快照,就可以通过遍历回滚指针的方式进行查找。

Read View

read view可以解决行的可见性。Read View是一个数组,由小到大保存了当前事务开启时所有还没有提交的事务列表,即不应该让这个事务看到的其他的事务ID列表。

当前有事务creator_trx_id想要读取某个行记录,这个行记录在叶子节点中的事务ID为trx_id,那么会出现以下几种情况:

  • 行记录trx_id < Read View中最小的事务id,也就是说这个行记录所在的事务在当前事务所在的所有活跃的事务创建之前就已经提交了,那么这个行记录对该事务是可见的
  • 行记录trx_id > Read View中最大的事务id,也就是说这个行记录所在的事务在当前事务所在的所有活跃的事务创建之后提交的,那么这个行记录对该事务是不可见的
  • 如果up_limit_id < trx_id < low_limit_id,说明该行记录所在的事务trx_id在目前creator_trx_id这个事务创建的时候,可能还处于活跃的状态,因此我们需要在trx_ids集合中进行遍历,如果trx_id存在于trx_ids集合中,证明这个事务trx_id还处于活跃状态,不可见。否则,如果trx_id不存在于trx_ids集合中,证明事务trx_id已经提交了,该行记录可见。

MVCC下查询一条记录:

InnoDB中,MVCC是通过Undo Log + Read View进行数据读取,Undo Log保存了历史快照,而Read View规则帮我们判断当前版本的数据是否可见。

  1. 首先获取事务自己的版本号,也就是事务ID;
  2. 获取当前事务的Read View;
  3. 查询行数据的事务id,然后与Read View中的事务版本号进行比较;
  4. 如果不符合ReadView规则,就需要从Undo Log中获取历史快照;
  5. 最后返回符合规则的数据。

读已提交实现机制:

在隔离级别为读已提交(Read Commit)时,一个事务中的每一次SELECT查询都会获取一次Read View,同样的查询语句都会重新获取一次Read View,这时如果Read View不同,就可能产生不可重复读或者幻读的情况。

可重复读实现机制:

当隔离级别为可重复读的时候,事务只在第一次SELECT的时候会获取一次Read View,而后面所有的SELECT都会复用这个Read View,这样就能同一事务读取数据不一致的情况。

InnoDB三种行锁的方式:

  • 行锁(记录锁):针对单个行记录添加锁。
  • 间隙锁(Gap Locking):可以帮我们锁住一个范围(索引之间的空隙),但不包括记录本身。采用间隙锁的方式可以防止幻读情况的产生。
  • Next-Key锁:帮我们锁住一个范围,同时锁定记录本身,相当于间隙锁+记录锁,可以解决幻读的问题。

InnoDB幻读解决机制:

InnoDB可以通过Next-Key锁+MVCC来解决幻读问题。InnoDB事务中,通过Next-Key锁住事务读取的范围,解决幻读情况。

例如:事务的读取height> 2.08 , Next-key将锁住heiht>2.08的部分,这样其他事务想要插入时就会失败,解决幻读问题。

标签:事务,Read,十二,ID,trx,MVCC,id,View
From: https://www.cnblogs.com/greengages/p/16620924.html

相关文章

  • HCIA学习笔记二十二:RSTP快速生成树
    一、RSTP快速生成树• RapidSpanningTreeProtocol快速生成树。• RSTP是STP的升级版本,与STP相比,最显著的特点就是通过新的机制,加快了收敛速度。二、交换机端口角......
  • MySQL事务MVCC、undolog和redolog
    MySql的MVCC多版本控制undolog:回滚日志(保证一致性)只有在ReadCommited和RepeatableRead隔离级别有用redolog:重写日志(保证持久性)示例讲解 ReadCommited隔离级别(4)se......
  • Hadoop 二十二
    参数优先级: 拿副本数举例子,优先级:hdfs-default.xml=>hadfs.xml=>在项目资源目录下的优先级高=>代码里的配置优先级高文件下载: ......
  • mysql6/视图/触发器/事务/四种隔离级别/事务日志/mvcc/内置函数/存储过程/索引/索引的
    视图触发器事务事务处理四种隔离级别事务日志MVCC内置函数存储过程索引索引的意义慢查询优化查询索引模拟视图1.什么是视图?视图是类似于临时表,由sql......
  • 事务管理(十二)
    1.概要什么是事务事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。事务的特性(ACID)原子性(Atomicity):事务是应用中不可再分的......
  • MVCC
    原理总体上来讲MVCC的实现是基于ReadView版本链以及Undo日志实现的MVCC就是在使用READCOMMITTD、REPEATABLEREAD这两种隔离级别的事务在执行普通的SELECT操作时访问记......
  • mysql MVCC中高水位先的trx_id
    读《mysql45讲》之后的总结 InnoDB为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务ID。“活跃”指的就是,启动了但还没提交数组里面事......
  • 【kuangbin】专题十二 基础DP1
    【kuangbin】专题十二基础DP1https://vjudge.net/contest/68966#overview前几周写了来着,忘更了我饿了,先放代码,吃完再来A-MaxSumPlusPlus#include<bits/stdc++.......
  • linux-0.11分析:进程初始化函数init(),第二部分(void) open("/dev/tty0",O_RDWR,0),第十
    第二部分,(void)open("/dev/tty0",O_RDWR,0);参考[github这个博主的厉害][https://github.com/sunym1993/flash-linux0.11-talk]它会触发一个int0x80中断,会找的sys_......
  • 20220816 第一组 于芮 数据库查询(第三十二天)
     小白成长记——第三十二天   今天是学数据库的第二天,学习的内容比昨天要稍微难一点,但是还是很好理解的,知识量很大,需要记忆的很多,很考验脑容量,但是还是要认真学习......