首页 > 数据库 >MySQL-InnoDB的MVCC

MySQL-InnoDB的MVCC

时间:2022-11-10 18:01:47浏览次数:48  
标签:事务 undefined 事物 MVCC Id yang InnoDB MySQL ID

    InnoDB MVCC   InnoDB 的 MVCC, 其实是通过 undo log 来实现的, 可以理解为是通过在每行记录后面保存两个隐藏的列来实现的, 分别保存了这个行的创建时间, 一个保存的是行的删除时间. 这里存储的并不是实际的时间值, 而是系统版本号(可以理解为事物的 Id), 每开始一个新的事物, 系统版本号就会自动递增, 事物开始时刻的版本号会作为事物 Id.   对应在数据中的表如下(后面两列是隐藏列, 我们通过查询语句并看不到)

 

    SELECT   InnoDB 会根据以下两个条件检查每行记录:     1. InnoDB 只会查找版本早于当前事务版本的数据行(也就是 行 的系统版本号小于或等于事物的系统版本号), 这样可以确保事物读取的行, 要么是在事物开始前已经存在的, 要么是事物自身插入或者修改过的.     2. 行 的删除版本要么未定义, 要么大于当前事务版本号( 这可以确保事物读取到的行, 在事物开始之前未被删除) 只有条件 1, 2 同时满足的记录, 才能返回作为查询结果     DELETE   InnoDB 会为删除的每一行保存当前系统的版本号( 事物ID) 作为删除标识       看下面的具体例子分析: 第二个事物, Id为 2:    
start transaction; 
select * from yang; 
select * from yang; 
commit;

  

    假设1:     假设在执行这个事物 Id 为2的过程中, 刚执行到 (1), 这时, 有另一个事物 Id 为 3 往这个表里插入了一条数据; 这个事物 Id 为 3     
start transaction;
insert into yang values(NULL,'tian');
commit;

  

     这时表中的数据如下:
id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 undefined
2 long 1 undefined
3 fei 1 undefined
4 tian 3  
        然后接着执行事物 2 中的 (2), 由于 id = 4 的数据的创建时间(事物 Id = 3), 执行当前事物的 Id 为 2, 而 InnoDB 只会查找事物 Id 小于等于当前事务 Id的数据行, 所以 id = 4 的数据行并不会在执行事务 2 中的 (2) 被检索出来, 在事物 2 中的两条 select 语句检索出来的数据如下
id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 undefined
2 long 1 undefined
3 fei 1 undefined
         假设2     假设在执行这个事物 ID 为 2 的过程中, 刚执行到 (1), 假设事物执行完事物 3 后, 接着有执行了事物 4;     
start transaction; 
delete from yang where id=1; 
commit;

  

     此时数据库中的表如下
id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 4
2 long 1 undefined
3 fei 1 undefined
4 tian 3 undefined
      接着执行事务 ID 为 2 的事物 (2), 根据 SELECT 检索条件可以知道, 它会检索创建时间( 创建事物的ID) 小于当前事物 ID 的行和删除事物的 ID 大于当前事务的行, 而 Id = 4 的行上面已经说过了, 而 Id = 1 的行由于删除时间 ( 删除事物 Id) 大于当前事务的 ID, 所以事物 2 的 (2) select * from yang 也会把 id = 1 的数据检索出来, 所以, 事物 2 中的两条 select 语句检索出来的数据都如下:
id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 4
2 long 1 undefined
3 fei 1 undefined
      UPDATE     InnoDB 执行 UPDATE, 实际上是新插入了一行记录, 并保存其创建时间为当前事物的 ID, 同时保存当前事务 ID 到要 UPDATE 的行的删除时间.   假设3:     假设在执行完事物 2 的 (1) 后又执行, 其他用户执行了事物 3, 4, 这时, 又有一个用户对这张表执行了 UPDATE 操作:   第 5 个事物:     
start transaction; 
update yang set name='Long' where id=2;
commit;

  

    根据 UPDATE 的更新原则: 会生成新的一行, 并在原来要修改的列的删除时间上添加本事物 ID, 得到表如下:
id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 4
2 long 1 5
3 fei 1 undefined
4 tian 3 undefined
2 Long 5 undefined
    继续执行事物 2 的(2), 根据 select 语句的检查条件, 得到下表:
id name 创建时间(事务ID) 删除时间(事务ID)
1 yang 1 4
2 long 1 5
3 fei 1 undefined
  还是和事物 2 中 (1) select 得到相同的结果.            

标签:事务,undefined,事物,MVCC,Id,yang,InnoDB,MySQL,ID
From: https://www.cnblogs.com/qiezi777/p/16877911.html

相关文章

  • MySQL-索引类型优缺点
     MySQL主要集中索引类型:FULLTEXT,HASH,BTREE,RTREE 1.FULLTEXT即为全文索引,目前只有MyISAM支持。不过目前只有CHAR,VARCHAR,TEXT列上可以创建全文索引。......
  • MySQL聚簇索引和非聚簇索引
     聚簇索引和非聚簇索引 在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表......
  • mysql多个结果集拼接一行
    五个不同的结果,查询出来,拼接成一行 SELECT*FROM ( SELECT plant_nameasplantName FROMpv_power_plant <iftest="plantId!=nullandplantId!=''"......
  • MySQL的InnerDB和MySAM索引实现
     InnoDB索引实现 InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。InnoDB的主索引:MyISAM索引文件和数据文件是分离的,索引文件仅保......
  • Centos mysql主从复制配置
    1、需要准备两台mysql服务器。我这里主机mt1 从机mt2查看两个服务器的防火墙是否关闭;如果没有关闭需要关闭。查看防火墙状态命令。statusfirewalld;如果是通过虚拟机克隆......
  • 关于使用pt-heartbeat监测MySQL主从复制延迟的方法
    pt-heartbeat的工作原理通过使用时间戳方式在主库上更新特定表,然后在从库上读取被更新特定表里的时间戳,再与本地系统时间对比来得出其延迟。具体流程:1)在主库上创建一张heart......
  • mysql (DDL)
    MYSQL(康老师-DDL) 创建和管理表SELECT*FROM`order`;#1.创建和管理数据库#1.1如何创建数据库#方式1:CREATEDATABASEmytest1;#创建的此数据库使用的是默认......
  • MySQL的排序和分页语句(十八)
    我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。上一章简单介绍了MySQL的分组和分组后筛选语句(十七),如果没有看过,​​请观看上一章​​一.MySQL的排序和分......
  • MySQL的分组和分组后筛选语句(十七)
    我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。上一章简单介绍了MySQL的查询where语句(十六),如果没有看过,​​请观看上一章​​一.MySQL的分组语句MySQL中......
  • MySql数据库触发器DML(数据库操作)
    1.数据库触发器的作用是什么?触发器主要用于强制复杂的业务规则和要求,还有助于强制引用的完整性,便于在添加,更新或删除表中的行时保留表之间已定义的关系。 2.新建两张......