MySql的MVCC多版本控制

undolog:回滚日志(保证一致性)只有在ReadCommited和RepeatableRead隔离级别有用

redolog:重写日志(保证持久性)

示例讲解

ReadCommited隔离级别(4) select1=张三,select2=张小三

RepeatableRead隔离级别(4) select1=张三,select2=张三

其中两个概念:

  • ReadView(快照读):select语句,每进行一次select就会触发一次快照生成ReadView,记录m_ids(当前未提交事务)、min_trx_id(当前最小事务号)、max_trx_id(当前最大事务号+1)、creator_trx_id(本事务号)
  • 当前读:update、delete、select ..for update、select ..lock share,每修改一次数据,会将日志记录在undolog中,并为修改列添加TRX_ID(事务编号)和ROLL_PTR(指向上一条事务的指针)字段

如上前3次修改就会形成如下版本链,第四个事务的第一次select会触发一次ReadView

版本链数据访问规则

for(当前事务id3,2,1判断){

1.判断当前事务id=creator_trx_id(4)?  成立,说明数据就是本身事务,可以直接访问(break当前事务数据)

2.判断当前事务id<min_trx_id(2)? 成立,说明数据已经提交,可以直接访问(break当前事务数据)

3.判断当前事务id>max_trx_id(5)? 成立,说明该事务在ReadView生成后才启动,不允许访问

4.判断min_trx_id<(2)=当前事务id<=max_trx_id(5)? 成立,查看当前事务是否在m_ids列表不存在数据,则代表已经提交,可以访问(break当前事务数据);ids中存在,则表示事务还未提交,根据指针到下一个事务判断

}

ReadCommited和RepeatableRead的差别是在同一个事务中,ReadCommited的多次select会生成多个ReadView,但RepeatableRead的话只复制第一个ReadView,所以不会出现幻读的问题。但:如果在RR情况下,同一个事务做了update等操作可能也会出现幻读。

MySQL事务MVCC、undolog和redolog的更多相关文章

  1. 《Mysql - 事务 MVCC》

    一:前言 - 前面通过 <Mysql 事务 - 隔离> 的学习,知道了事务的实现,是根据 获取一致性视图 来实现的. 二:那么,什么时候会获取到一致性视图呢? - 例如:有三个事务,启动的 ...

  2. MySQL 事务 MVCC 版本链

      版本链   对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含row_id列):  1) ...

  3. Mysql 数据恢复流程 基于binlog redolog undolog

    注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...

  4. mysql事务原理及MVCC

    mysql事务原理及MVCC 事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个 基本特性如数家珍.但是聊起事务或者ACID的底层实现原理,往往言之不详,不 ...

  5. 温故知新-Mysql锁&事务&MVCC

    文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...

  6. 面试官:什么是MySQL 事务与 MVCC 原理?

    作者:小林coding 图解计算机基础网站:https://xiaolincoding.com/ 大家好,我是小林. 之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候, ...

  7. 数据库篇:mysql事务原理之MVCC视图+锁

    前言 数据库的事务特性 数据并发读写时遇到的一致性问题 mysql事务的隔离级别 MVCC的实现原理 锁和隔离级别 关注公众号,一起交流,微信搜一搜: 潜行前行 1 数据库的事务特性 原子性:同一个事 ...

  8. mysql 事务,锁,与四大隔离级别

    概念 事务 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个 ...

  9. 【原创】想了解Mysql事务,知道这些就够了

    Mysql事务:1. 事务进行一次数据库操作时将数据会存到BufferPoll缓存池中2. 数据存入缓存池后,Mysql会新建一个线程将数据存入到RedoLogBuffer中3. 事务提交时RedoL ...

  10. mysql事务和并发控制

    谈到事务,首先想到的问题是并发控制.比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为 ...

随机推荐

  1. Nginx的重写功能——Rewrite

    Nginx的重写功能--Rewrite https://huaweicloud.csdn.net/63566cced3efff3090b5f470.html?spm=1001.2101.3001.66 ...

  2. kubernetes:v1.25 + containerd

    由于kubernets从v1.24开始停止支持dockershim,kubernets不再支持通过docker来创建和管理容器.本文记录安装kubernetes v1.25 + containerd ...

  3. docker中安装elasticsarch 等镜像

    1.在dockerhub中查找镜像 2.查看镜像下的说明,如下图标识成功 a.安装elasticsearch 运行命令 docker run --name myes01 -d -p 9200:9200 ...

  4. mysql去重保留1条记录

    delete from `wuye` where wuye_id in ( select * from ( select wuye_id from `wuye` where wuye_name in ...

  5. c/c++工程中为什么仅仅main.cpp引用其他源文件的头文件不够,源文件还要引用自身的头文件?

    原博客链接: https://blog.csdn.net/khwkhwkhw/article/details/49798985?utm_source=app&from=timeline 引言: ...

  6. Jmeter 命令执行脚本并输出报告

    Jmeter 可以通过cmd 命令执行脚本,并输出报告 执行顺序如下: 第一 进入 安装的jmeter bin 目录下:(我安装的是E盘)

  7. Android组件化开发-----页面路由(ARouter)

    平时开发中,我们经常用到页面跳转功能.之前我一直使用Intent过跳转 Intent intent = new Intent(A.this, B.class); intent.putExtra(&qu ...

  8. SqlSugar 代码生成 数据库及表

    在实际开发中如何在sqlsugar中通过model生成数据表呢? 废话不说上代码 一.引入sqlsugarcore 二.编写Model代码 先写一个model举例 namespace 用户管理.Mod ...

  9. pytorch的cuda版本安装

    机器上加了RTX3060的卡,cuda装的11.1的版本,cudnn还不是特别清楚装的哪个版本?vs是2017这个版本的.下面来装pytorch.主要参考这个网站的内容"https://bl ...

  10. android studio的一些辅助工具

    目录配置 https://blog.csdn.net/Kideers/article/details/128233984 https://blog.csdn.net/hnjcxy/article/de ...