首页 > 其他分享 >极客--事务到底是隔离还是不隔离

极客--事务到底是隔离还是不隔离

时间:2022-09-19 21:22:37浏览次数:64  
标签:事务 极客 快照 隔离 启动 -- Innodb 版本

可重复读隔离级别,事务T启动的时候会创建一个read-view,之后事务T执行期间,即使其他事务修改了数据,事务T看到仍然在启动时看到的一样。也就是说,一个可重复读的隔离级别下执行的事务,好像与世无争,不受影响,那么等到事务自己获取到行锁更新数据的时候,它读到的是什么呢?
image

begin/start transaction命令并不是一个事务的起点,在执行到它们之后的第一个Innodb语句,事务才真正启动,可以使用start transaction with consistent snapshot这个命令

  • 第一种启动方式在执行第一个快照语句的时候创建的。
  • 第二种启动方式,一致性视图在执行start transaction with consistent snapnot时创建
  • update语句本身就是一个事务

在Mysql里,有两个视图的概念

  • 一个是view.它是查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图语法是create view...,而它的查询方法与表一样
  • 另一个是Innodb在实现MVCC时用到一致性视图,即consitent read view 用于支持RC和RR隔离级别

快照在MVCC里面是怎样工作的

在可重复读隔离级别下,事务启动的时候就拍了一个快照,这个快照是基于整库的。(那岂不是很慢?)

  • Innodb里面每个事务都有一个唯一ID,叫做transactionID,他是在事务开始的时候Innodb的事务系统申请的,严格按照申请顺序严格递增
  • 而每行数据也都是有多个版本,每次事务更新数据的时候,都会生成一个新的数据版本,并且吧transaction_id赋值给这个数据版本的事务ID,记为row_trx_id。同时,旧的数据版本也要保留,并且在新的数据版本中,能够有信息可以直接拿到它
    image

undolog

  • 图中v1 v2 v3并不是真实存在的,而是每次需要的时候根据当前版本与undo log计算出来的。需要V2的时候,就需要通过v4依次执行U3 U2算出来
  • 也就是可重复读隔离级别下,在它启动之后生成的版本号是不认得,他也要找到上一个版本
  • 实现上Innodb为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在活跃的所有事务ID,活跃指的是启动了但没提交
  • 数组里面事务ID最小值记作低水位,当前系统里面创建过的事务ID最大值加1记作高水位
    image
当前事务启动瞬间,一个数据版本的row_trx_id有以下几种可能:
  1. 如果落在绿色部分,表示这个版本是已提交的事务或者是当前事务自己生成的,这个数据是可见的
  2. 如果落在红色部分,这个版本由将来事务自己生成的,这个数据也是可见的。
  3. 如果落在黄色部分,分为两种情况
    a.若row_trx_id在数组中,表示这个版本是由还没提交的事务生成的,不可见
    b.若row_trx_id不在数组中,表示这个版本是已经提交了的事务生成的,可见
Innodb利用所有数据都有多个版本的特性,实现了秒级快照能力

更新语句都是先读后写,而这个读,只能是读当前值

标签:事务,极客,快照,隔离,启动,--,Innodb,版本
From: https://www.cnblogs.com/dodogod/p/16709114.html

相关文章

  • break continue
    breakcontinuebreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)continu......
  • 基本的反爬措施
    #添加header信息,这是最基本的反爬措施url="https://www.dianping.com/"header={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537......
  • Python 代码智能感知 —— 类型标注与特殊的注释(献给所有的Python人)
    【原文地址:https://xiaokang2022.blog.csdn.net/article/details/126936985】​一个不会写好的类型标注和注释的Python程序员,是让使用TA的代码的人都痛苦无比的事情…......
  • 罗马数字转阿拉伯数字
    (1)不是,位置计数是一种表达数字的系统,数位按照顺序排列,每个数位有一个位值,数字的值是每个数位和位值的乘积之和,而罗马数字表示方式为相同的数字连写、所表示的数等于这些......
  • Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Python代......
  • ArcGIS Pro 二次开发缓冲区代码
    varvalueArray=awaitQueuedTask.Run(()=>{varg=newList<object>(){geometry,};//Createsa8000-meter......
  • hive substring_index 函数
    substring_index详解substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数例子:str=www.wikibt.comsubstring_index(str,'.',1)......
  • 使用Supervisord管理Docker内的服务,容器启动就退出
    问题:启动后直接退出command:"/usr/bin/supervisord-c/etc/supervisord.conf"解决方法:将supervisor配置的nodaemon=false修改为nodaemon=true,使supervisor......
  • Windows中使用SMB共享文件夹
    SMB共享文件夹简单步骤:打开【控制面板】打开【启动或关闭windows功能】打开【SMB1.0/CIFS文件共享支持】重启电脑到磁盘中选择需要共享的文件夹选中文件夹【属性......
  • planner(Oct)
    2022.10SunMonTueWedThuFriSat2526272829301234567891011121314151617181920212223242526272829303112......