MySQL事务MVCC、undolog和redolog
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的更多相关文章
- 《Mysql - 事务 MVCC》
一:前言 - 前面通过 <Mysql 事务 - 隔离> 的学习,知道了事务的实现,是根据 获取一致性视图 来实现的. 二:那么,什么时候会获取到一致性视图呢? - 例如:有三个事务,启动的 ...
- MySQL 事务 MVCC 版本链
版本链 对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列(row_id并不是必要的,我们创建的表中有主键或者非NULL唯一键时都不会包含row_id列): 1) ...
- Mysql 数据恢复流程 基于binlog redolog undolog
注:文中有个易混淆的地方 sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,同时undolog维护了此事务是否完成的状态. 日志持久化事务,为了保证redolog和 ...
- mysql事务原理及MVCC
mysql事务原理及MVCC 事务是数据库最为重要的机制之一,凡是使用过数据库的人,都了解数据库的事务机制,也对ACID四个 基本特性如数家珍.但是聊起事务或者ACID的底层实现原理,往往言之不详,不 ...
- 温故知新-Mysql锁&事务&MVCC
文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...
- 面试官:什么是MySQL 事务与 MVCC 原理?
作者:小林coding 图解计算机基础网站:https://xiaolincoding.com/ 大家好,我是小林. 之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候, ...
- 数据库篇:mysql事务原理之MVCC视图+锁
前言 数据库的事务特性 数据并发读写时遇到的一致性问题 mysql事务的隔离级别 MVCC的实现原理 锁和隔离级别 关注公众号,一起交流,微信搜一搜: 潜行前行 1 数据库的事务特性 原子性:同一个事 ...
- mysql 事务,锁,与四大隔离级别
概念 事务 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个 ...
- 【原创】想了解Mysql事务,知道这些就够了
Mysql事务:1. 事务进行一次数据库操作时将数据会存到BufferPoll缓存池中2. 数据存入缓存池后,Mysql会新建一个线程将数据存入到RedoLogBuffer中3. 事务提交时RedoL ...
- mysql事务和并发控制
谈到事务,首先想到的问题是并发控制.比如两个用户同时操作数据库里面的一张表,一个正在读数据,一个正在删除数据,那么读数据的读出的结果究竟是多少?并发可以提高系统的性能,让多个用户同时操作一份数据,但为 ...
随机推荐
- Nginx的重写功能——Rewrite
Nginx的重写功能--Rewrite https://huaweicloud.csdn.net/63566cced3efff3090b5f470.html?spm=1001.2101.3001.66 ...
- kubernetes:v1.25 + containerd
由于kubernets从v1.24开始停止支持dockershim,kubernets不再支持通过docker来创建和管理容器.本文记录安装kubernetes v1.25 + containerd ...
- docker中安装elasticsarch 等镜像
1.在dockerhub中查找镜像 2.查看镜像下的说明,如下图标识成功 a.安装elasticsearch 运行命令 docker run --name myes01 -d -p 9200:9200 ...
- mysql去重保留1条记录
delete from `wuye` where wuye_id in ( select * from ( select wuye_id from `wuye` where wuye_name in ...
- c/c++工程中为什么仅仅main.cpp引用其他源文件的头文件不够,源文件还要引用自身的头文件?
原博客链接: https://blog.csdn.net/khwkhwkhw/article/details/49798985?utm_source=app&from=timeline 引言: ...
- Jmeter 命令执行脚本并输出报告
Jmeter 可以通过cmd 命令执行脚本,并输出报告 执行顺序如下: 第一 进入 安装的jmeter bin 目录下:(我安装的是E盘)
- Android组件化开发-----页面路由(ARouter)
平时开发中,我们经常用到页面跳转功能.之前我一直使用Intent过跳转 Intent intent = new Intent(A.this, B.class); intent.putExtra(&qu ...
- SqlSugar 代码生成 数据库及表
在实际开发中如何在sqlsugar中通过model生成数据表呢? 废话不说上代码 一.引入sqlsugarcore 二.编写Model代码 先写一个model举例 namespace 用户管理.Mod ...
- pytorch的cuda版本安装
机器上加了RTX3060的卡,cuda装的11.1的版本,cudnn还不是特别清楚装的哪个版本?vs是2017这个版本的.下面来装pytorch.主要参考这个网站的内容"https://bl ...
- android studio的一些辅助工具
目录配置 https://blog.csdn.net/Kideers/article/details/128233984 https://blog.csdn.net/hnjcxy/article/de ...