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 ...
随机推荐
- 既有Nginx重新动态编译增加http2.0模块
1.HTTP2.0 HTTP2.0相较于http1.x,大幅度的提升了web性能,在与http1.1完全语义兼容的基础上,进一步减少了网络延时.我们现在很多对外的网站都采用https,但是F12一下看 ...
- B - B(Is It A Tree?)
给出一堆边给你,让你判断这是不是一棵树.边的信息以(start , end)的形式给出. A tree is a well-known data structure that is either em ...
- poj2926Requirements (曼哈顿距离)
Description An undergraduate student, realizing that he needs to do research to improve his chances ...
- ABP设置管理模块: Abp.SettingUi
开源地址: https://github.com/EasyAbp/Abp.SettingUi 一直想宣传一下SettingUi, 因为 懒 工作比较忙, 所以才拖到今天. 关于ABP就不需要我再多废口 ...
- Numpy Quickstart tutorial
此文是关于Numpy的一些基本用法, 内容来源于Numpy官网:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html 1.The Basi ...
- POJ 3415 Common Substrings(后缀数组 + 单调栈)题解
题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(r ...
- codevs1169传纸条 不相交路径取最大,四维转三维DP
这个题一个耿直的思路肯定是先模拟.. 但是我们马上发现这是具有后效性的..也就是一个从(1,1)开始走,一个从(n,m)开始走的话 这样在相同的时间点我们就没法判断两个路径是否是相交的 于是在dp写挂 ...
- JavaScript Engine 可视化
JavaScript Engine 可视化 图解 JavaScript Engine JavaScript 可视化 (7 部曲) ️ JavaScript Visualized: Event Loop
- React + GraphQL 2020 速成课程
React + GraphQL 2020 速成课程 technologies React (to build our user interface) GraphQL (to get and chang ...
- how to watch vuex state update
how to watch vuex state update watch https://vuex.vuejs.org/api/#watch https://vuex.vuejs.org/guide/ ...