MVCC多版本并发控制器
在多个事务并发执行的时候,MVCC机制可以协调数据的可见性,事务的隔离级别就是建立在MVCC之上的;
MVCC机制通过undo log链和ReadView机制来实现;
undo log版本链:

在数据库的每行记录中,都有两个隐藏字段,trx_id和roll_pointer,trx_id就是最近一次更新这个记录的事务id,roll_pointer就是指向这个事务生成之前的那个事务的undo_log回滚日志;
比如,当前事务A插入了一条新记录,这个记录的trx_id就是事务A的id,roll_pointer指向的就是一个空的undo log;
然后,来了一个事务B,事务B更新了这条记录,那么这个记录的trx_id就是事务B的id,roll_pointer指向的就是之前那个事务的undo log;
这样,多个事务更新这个记录的时候,每次都会更新trx_id的值,并形成一个undo_log版本链;
ReadView机制:
当执行一个事务的时候,就会生成一个ReadView,里面存放了四条数据:
m_ids:记录的是此时正在执行的事务id
min_trx_id:记录的是m_ids中的最小的事务id
max_trx_id:记录的是m_ids中的最大的事务id+1,就是下一个会生成的事务id
creator_trx_id:记录的是本事务的id

比如,此时有一条记录,trx_id是10;这时候生成了事务A(id=20)想要读数据,事务B(id=30)想要写数据,那么事务A生成的ReadView中,m_ids就是[20,30],min_trx_id=20,max_trx_id=31,creator_trx_id=20;
此时,事务A去查询这条记录,发现trx_id=10,小于自己的min_trx_id,这就说明这个数据在事务A生成之前就被更新过了,可以放心读;
然后,事务B去更新了这个记录,这个记录的trx_id就会变为30,然后事务A再去查询,发现trx_id=30,在自己的min_trx_id和max_trx_id之间,这就说明这个记录被一个和自己在差不多时间执行的事务修改过,然后再去查看这个trx_id=30在不在自己的m_ids中,发现在里面,说明修改这个数据的事务是和自己并发执行的,所以,这个数据就是不能读的,只能读到roll_pointer链上的上一次trx_id=10的数据;
通过ReadView和undo_log日志链,就可以保证事务A不会读到并发执行的事务B修改的数据;
假设,然后事务A又自己去更新了这条数据,那么再查询,记录的trx_id就会是20,和自己的creator_trx_id一样,也就是说是自己改的,当然是可以读的;
假设,又来了一个事务C(id=40),去更新这个记录,那么事务A再次查询,发现trx_id=40,比自己的max_trx_id大,那就说明数据被一个新的事务修改了,当然也不能读,只能顺着undo log链往前读数据;
通过ReadView机制和undo_log日志链,就可以判断当前记录的哪个版本是我们可以读的。
RC隔离级别如何基于ReadView机制实现:
读提交隔离级别,在每次查询的时候,都会生成一个新的ReadView;
当事务A查询一个记录的时候,产生一个新的ReadView,如果这个记录的trx_id在自己的min_trx_id和max_trx_id之间,并且在自己的m_ids里,那说明这个记录被一个还没提交的事务修改了,当然不可读;
如果事务B提交了修改,那么事务B就不会出现在事务A的ReadView,当然就可以读了;
RR隔离级别如何基于ReadView机制实现:
在可重复读级别下,会在事务中的第一次查询的时候,生成一个ReadView,之后事务里的查询都用这个ReadView,但是可以自己更新;
当事务A查询一个记录的时候,产生一个ReadView,此时读到第一次数据,如果这时候事务B修改了数据,那么记录的trx_id就会更新,这时候事务A再查询数据,用的还是第一次的ReadView,所以即使事务B已经提交了,事务A读到trx_id的时候,这个trx_id肯定是要么大于max_trx_id,要么还在m_ids里,所以不会读这个数据,会顺着undo_log链去找之前的数据,因此读到的还是第一次数据,实现可重复读;
当然,如果是事务A自己修改了数据,是可以读到的;
MVCC多版本并发控制器的更多相关文章
- MySQL的事务机制和锁(InnoDB引擎、MVCC多版本并发控制技术)
一.事务(数据库的事务都通用的定义) 1.1 事务定义 事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行.事务通常以 BEGIN TRANSACTION 开始 ...
- 《高性能Mysql》解读---Mysql的事务和多版本并发
1.base:ACID属性,并发控制 2.MySql事务的隔离级别有哪些,含义是什么? 3.锁知多少,读锁,写锁,排他锁,共享锁,间隙锁,乐观锁,悲观锁. 4.Mysql的事务与锁有什么关联?MySq ...
- Java核心-多线程-并发控制器-CountDownLatch倒数闩
1.基本概念 CountDownLatch,中文名倒数闩,jdk并发工具包中一个并发控制器,它抽象了一个常见的多线程并发场景,开发人员使用它可以写出同时兼顾线程安全性与高效率的代码. 2.抽象模型 相 ...
- Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- (转)innodb 多版本并发控制原理详解
转自:https://blog.csdn.net/aoxida/article/details/50689619 多版本并发控制技术已经被广泛运用于各大数据库系统中,如Oracle,MS SQL Se ...
- MySQL 到底是如何做到多版本并发的?
之前的文章简单的介绍了 MySQL 的事务隔离级别,它们分别是:读未提交.读已提交.可重复读.串行化.这篇文章我们就来探索一下 MySQL 事务隔离级别的底层原理. 本篇文章针对 InnoDB 存储引 ...
- InnoDB学习(五)之MVCC多版本并发控制
MVCC多版本并发控制,是一种数据库管理系统并发控制的方法.MVCC多版本并发控制下,数据库中的数据会有多个版本,分别对应不同的事务,从而达到事务之间并发数据的隔离.MVCC最大的优势是读不加锁,读写 ...
- mysql的MVCC多版本并发控制机制
MVCC多版本并发控制机制 全英文名:Multi-Version Concurrency Control MVCC不会通过加锁互斥来保证隔离性,避免频繁的加锁互斥. 而在串行化隔离级别为了保证较高的隔 ...
- MVCC多版本并发控制
MVCC多版本并发控制 爱情小傻蛋关注 82019.09.28 23:23:37字数 4,740阅读 91,421 前提概要 什么是MVCC 什么是当前读和快照读? 当前读,快照读和MVCC的关系 M ...
随机推荐
- django开发东京买菜,全栈项目,前端vue,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等
因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...
- 洛谷 P6225 [eJOI2019]异或橙子 (树状数组)
题意:有\(n\)个数,起始值均为\(0\),进行\(q\)次操作,每次输入三个数,如果第一个数为\(1\),则将第\(i\)个数修改为\(j\),如果为\(2\),则求区间\([l,r]\)内的所有 ...
- Filebeat 日志收集
Filebeat 介绍 Filebeat 安装 # 上传代码包 [root@redis03 ~]# rz filebeat-6.6.0-x86_64.rpm # 安装 [root@redis03 ~] ...
- 进程控制——fork-and-exec、system、wait
forc-and-exec流程 父进程与子进程之间的关系十分复杂,最大的复杂点在于进程间相互调用.Linux下这一流程称为fork-and-exec.父进程通过fork的方式产生一个一模一样的子进程, ...
- 深入理解gradle中的task
目录 简介 定义task tasks 集合类 Task 之间的依赖 定义task之间的顺序 给task一些描述 task的条件执行 task rule Finalizer tasks 总结 深入理解g ...
- es6 curry function
es6 curry function // vuex getters export const getAdsFilterConfig = (state) => (spreader) => ...
- How to get the real screen size(screen resolution) by using js
How to get the real screen size(screen resolution) by using js 获取用户屏幕的真实像素分辨率, 屏幕实际尺寸 window.deviceP ...
- CSS3 优先级
CSS3 优先级 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity 优先级 在本文章中 概念 优先级是如何计算的? 选择器 ...
- Google Advanced Search Skills
Google Advanced Search Skills site:
- svn conflict & svn cleanup
svn conflict & svn cleanup OK $ svn --help $ svn cleanup Tree Conflicts https://tortoisesvn.net/ ...