MVCC(多版本并发控制)详解
在 MySQL InnoDB存储引擎下,RC、RR 基于 MVCC 进行并发事务控制, MVCC 是基于“数据版本”对并发事务进行访问
用一个例子来解释一下,下面是一张事务执行流程图:

稍微解释一下:
事务 A将id=1088的记录的name改为 “张三”,并提交事务 B将id=1088的记录的name改为 “张小三”,并提交事务 C将id=1088的记录的name改为 “张老三”,并提交事务 D只是去查询id=1088 的记录
首先模拟一下在 RC 隔离级别下:事务D 第一次读取的数据是 “张三”,第二次读取的就是“张小三”
这里应该很好理解,因为在 RC 隔离级别下,事务D 能读到 commit 的数据,所以就导致了“不可重复读”问题
如果使用 RR 隔离级别,事务D 的两次读取都是 “张三”
RR 隔离级别是基于 MVCC 实现的,MVCC 又依赖 UNDO_LOG,UNDO_LOG就是回滚日志,它是一个版本链,它记录了上一次版本的数据变化
eg:事务 B 把“张三”改为了“张小三”,在UNDO_LOG 中的体现如下:

注:最原始的数据,也就是最下面这一条,它的 事务ID和 回滚指针 都是 null
了解了 UNDO_LOG 之后,现在引入一个新的名词:ReadView(快照读)
快照都就是普通的 sql 查询语句:select ....
有了快照读就有当前读,当前读是指:
Insert、Update、Delete、
Select ... for update
Select ... lock in share mode
ReadView 数据结构

图是从 IT老齐 那儿盗的,稍微解释一下:
m_ids 未提交的事务,不允许读
min_trx_id 就是快要执行完的事务 id
max_trx_id 就是下一个新的事务的 id
creator_trx_id 就是创建这个 ReadView 是哪个事务
RC 原理
RC(读已提交):在每一次执行快照读时生成 ReadView,根据上面的例子

读了两次,生成了两个 ReadView,先看第一个 ReadView,因为在这个 ReadView 生成的时候,事务1 已经 commit 了,所以他不在活跃事务集合里面,所以 m_ids 是 2,3,4
最小活跃事务就是 2 没有异议
预分配事务id 就是 4+1 = 5
当前的 ReadView 是事务 4 创建的,所以 creator_trx_id = 4
第二个 ReadView 也是一样的的逻辑
版本链数据访问规则:

RR 原理
可重复读原理很简单,就是复用 ReadView

eg:在第二次查询的时候,生成的 ReadView 是复用前一次的,所以不会造成 不可重复读
RR 能解决幻读吗?
能,但不完全能。
如果是多次快照读,ReadView会产生复用,没有幻读产生
但是当多次快照读中间存在当前读,ReadView会重新生成,导致产生幻读

MVCC(多版本并发控制)详解的更多相关文章
- gcc5.2版本安装详解
gcc5.2版本安装详解 1.下载gcc-5.2安装包 gcc各版本浏览地址:http://ftp.gnu.org/gnu/gcc/gcc-5.2浏览地址:http://ftp.gnu.org/gnu ...
- CentOS 最新版的下载地址 + 版本选择详解
CentOS 最新版的下载地址 + 版本选择详解 发现越来越多的机关单位.事业单位开始使用 Linux 作为主要服务器,毕竟,Linux的稳定性和高效性是众所周知的,所以我也打算把自己这一块技术加强一 ...
- [转帖]rename(Perl语言版本) 详解
rename(Perl语言版本) 详解 2019-03-19 22:51:23 wayne17 阅读数 464更多 分类专栏: Ubuntu之路 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- 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 ...
- 【Mysql】深入理解 MVCC 多版本并发控制
MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大, ...
- MVCC多版本并发控制的理解
前置知识 当前读与快照读 当前读 什么是当前读:读取的是最新的数据,不会读到老数据. 何时触发:update.insert.delete.select lock in share mode.selec ...
- MySQL MVCC(多版本并发控制)
概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit ...
- [MySQL] MVCC 多版本并发控制实现的事务
1.没有一个统一的实现标准,实现了非阻塞的读操作,写操作也只锁定必要的行2.通过保存数据在某个时间点的快照实现的3.典型的有乐观并发控制和悲观并发控制4.innodb的mvcc是每次事务都有递增的版本 ...
随机推荐
- Android Studio制作简单登录界面
实现目标 应用线性布局设计登录界面,要求点击输入学号时弹出数字键盘界面,点击输入密码时弹出字母键盘,出现的文字.数字.尺寸等全部在values文件夹下相应.xml文件中设置好,使用时直接引用.当用户名 ...
- mmdetection使用wandb查看训练日志
mmdetection查看日志之前一直是在用TextLoggerHook,已经觉得挺方便的了,自从用了wandb之后,发现wandb真不错,看log更方便了,回不去了. wandb的简单配置: wan ...
- 用fpga实现1G Eth TCP&UDP硬件协议栈
用fpga实现的1G 以太网硬件协议栈,属于轻的协议栈
- 房屋设计H51图纸
- Springmvc来做甘特图的显示控制。
springmvc没有Springboot好用:所以就用了ajax通信来获取数据,这其中有不少坑,我来带大家踩一踩. 1.在控制层中,接口不能直接返回Json格式. 我的解决方法可以使通过map,或者 ...
- requests模块发送post请求,flask开启服务接收请求,python
request模块部分 import requests import json if __name__ == '__main__': url = 'http://127.0.0.1:5000' dat ...
- 力扣71(java)-简化路径(中等)
题目: 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径. 在 Unix 风格的文件系统中,一个点(.)表示当前目 ...
- Hologres+Hologres+Flink流批一体首次落地4982亿背后的营销分析大屏Flink流批一体首次落地4982亿背后的营销分析大屏
简介: 本篇将重点介绍Hologres在阿里巴巴淘宝营销活动分析场景的最佳实践,揭秘Flink+Hologres流批一体首次落地阿里双11营销分析大屏背后的技术考验. 概要:刚刚结束的2020天猫双1 ...
- 免费体验!阿里云智能LOGO帮你解决设计难题
简介:超实用!零基础搞定一个高大上的智能logo设计 新年过后,往往是大家一年中士气最足的时候,散去了年末的疲惫和emo,重燃对新一年的热情和希望. 想创业的朋友们同样意气风发,趁着新年的劲头想大干 ...
- DevOps发布策略简介
简介: DevOps追求更短的迭代周期.更高频的发布.但发布的次数越多,引入故障的可能性就越大.更多的故障将会降低服务的可用性,进而影响到客户体验.所以,为了保证服务质量,守好发布这个最后一道关,阿里 ...