一图看懂MVCC机制,RC级别解决脏读问题,RR级别怎么解决不可重复读问题【MySQL系列】
说起事务隔离级别和各自解决的问题,相信学过MySQL的人都倒背如流,
三类问题:脏读、不可重复读、幻读问题;
四种隔离级别:
读不提交,最低的隔离级别,存在脏读、不可重复读、幻读问题;
读已提交,能解决脏读问题,存在不可重读读、幻读问题;
可重复读,能解决脏读、不可重复读问题,但依旧存在幻读问题;
串行化,最高的隔离级别,能解决以上三个问题,但效率最低;
关于事务隔离级别详解,可以看我上一篇博客:一图看懂MySQL事务及其实现手段【MySQL系列】
今天要总结的是更深一层次的内容,试问如果基于以上内容再往下深问一句:读已提交为什么不能解决不可重复读问题?可重复读隔离级别下为什么又能解决不可重复读问题?具体是怎么解决的?我相信很多人就不知所措了,因为学的时候大家普遍都只知道个概念,具体底层原理没有过多的关心,我之前学习也是这样的,最近看了一些资料,决定写篇博客总结记录下来。以下内容是看了老齐架构300讲后结合以前学的知识点,个人总结的一个比较全面的关于MVCC机制的文章,从隔离级别下问题的产生到解决原理详细阐述了MySQL事务和隔离级别的底层原理,水平有限,欢迎大家批评指正。用一张图全面总结下MVCC机制的前因后果,结合图和后面的详解,希望能帮助大家深刻理解MVCC机制。
先分析一下脏读是怎么产生的,即事务A更改了某条数据,事务B读取,随后事务因为某些原因回滚了,此时事务B读的数据就是“脏数据”,称为脏读。产生脏读的原因也很简单,事务B读取了事务A未提交的数据。因此读已提交(只能读取事务提交后的数据)能解决脏读问题。
至于不可重复读问题,是事务A读取了某条数据,随后事务B更改了这条数据,事务A再次读取,发现数据不一致了(即使读已提交,也不能解决不可重复读问题,因为事务B如果已经提交了事务,此时读已提交隔离级别下是可以读到的,这里也涉及到了MVCC机制,后面会详细讲),因此读已提交解决不了不可重复读问题。
那么可重复读隔离级别下,又是怎么解决不可重复读问题的呢?这就需要讲解今天的重点——MVCC(Mutil-Version Concurrency Control)多版本并发控制机制,实现了MySQL在InnoDB引擎下RC级别和RR级别下对数据库的并发访问,每次select操作会访问数据库中的版本链记录,其他事务可以修改这条记录,而select根据当前隔离级别去版本链中找到对应的版本记录,实现了读-写,写-读的并发执行,提升了系统的性能。
在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会访问版本链中的记录的过程。
这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT可以去版本链中拿记录,这就实现了读-写,写-读的并发执行,提升了系统的性能。
先解析三个概念,当前读、快照读和ReadView。
当前读:读的都是最新版本的数据,会对数据进行加锁操作,防止其他事务修改当前数据。是悲观锁的一种实现方式。insert、update、select …for update、select…lock in share mode都是当前读;
快照读:最普通的不加锁的select读到的数据,读到的不一定是最新数据,有可能是之前历史版本的数据;
ReadView:快照读的一种形式,MySQL执行MVCC提取数据的依据;本质是一个数据结构,其中包括几下几个部分:
1. m_ids:当前活跃的事务ID集合(开启但未提交的事务ID);
2. min_trx_ids:最小活跃事务ID,小于它说明事务已经提交;
3. max_trx_ids:预分配的事务ID(下一个事务开启分配的事务ID),即当前最大事务ID+1;大于它说明该事物是ReadView生成之后才开启;
4. creator_trx_id:ReadView创建者的事务编号;
版本链:MySQL数据库中,每条数据除肉眼可见的数据之外,还有几个隐藏字段:
1.db_trx_id:记录最近修改这条记录的事务ID;
2.db_roll_pointer:回滚指针,指向指向这条数据的上一个版本记录;
3.db_row_id:隐藏的自增ID(隐藏的自增主键),如果表没有主键,InnoDB会自动以db_row_id生成主键索引;
实际上,RC和RR两个隔离级别,实现的主要区别在于ReadView的时机不一样,RC隔离级别下,每次快照读都会生成一个ReadView;而RR级别下,只有在第一次快照读时生成ReadView,后面会延续使用;事务根据生成的ReadView去版本链中寻找自己能够访问的数据,最后得到所读的数据;而这个寻找可读数据的规则就至关重要了。
判断规则如下:
1.当前记录修改操作事务ID 等于 ReadView创建事务ID ? 等于说明是自身事务修改的数据,可以访问;
2.判断 trx_id < min_trx_id(2) ? 如果小于说明事务提交了,可以访问;
3. 判断trx_id >= max_trx_id(5) ? 成立说明该事物是在ReadView生成之后才开启的,不允许访问,不成立继续向下判断;
4. 判断min_trx_id <= trx_id < max_trx_id,成立则在m_ids中对比,如果不存在说明事务已经提交,可以访问;
5. 不满足以上条件,根据回滚指针依次往前一个版本数据查找,直到找到满足条件的数据;
这样根据完整的MVCC机制就实现了MySQL并发下的读-写、写-读的并发执行操作;保证了对应RC和RR级别下,解决对应的问题。
一图看懂MVCC机制,RC级别解决脏读问题,RR级别怎么解决不可重复读问题【MySQL系列】相关推荐
- 一张图看懂2017双11中的网络产品和技术
摘要: 大家都知道,2017年双11又创造了新纪录,全天交易额1682亿,交易峰值32.5万笔/秒,支付峰值25.6W笔/秒,狂欢的背后是极其复杂庞大的技术系统,其中就有大量阿里云云计算相关的产品和技 ...
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
- 一张图看懂微服务架构路线
目录 一张图看懂微服务架构路线 我为什么选择微服务架构? 微服务架构路线 基本思路 Docker 容器编排 Docker 容器管理 API网关 负载均衡 服务发现 事件总线 日志记录 监控和警报 分布 ...
- 【重磅】一图看懂阿里云两个新大脑:ET 医疗大脑和 ET 工业大脑
3月27日至29日,阿里云2017年第一场云栖大会在深圳拉开帷幕.29日上午的主题演讲由阿里巴巴副总裁.阿里云总裁胡晓明带来.在题为<通往智能之路>的演讲中,他与现场数百名开发者.媒体和合 ...
- 一张脑图看懂BUI Webapp移动快速开发框架【上】--框架与工具、资源
前言 之前写过一篇 2018开发最快的Webapp框架--BUI交互框架 ,如果你还没看过,可以简单看一下,主要介绍了BUI的基本功能,有多少控件,以及实现的思路,BUI 1.5版本以后变化很大,统一 ...
- 网络协议——一张图看懂网络分层
目录 一.四个问题 二.网络为什么分层? 三.程序时如何工作的 3.1 一张图看懂工作过程 3.2 接受包 3.3 发起请求 四.层与层之间的关系 一.四个问题 1. TCP进行三次握手时,IP层和M ...
- 一张图看懂图像识别算法发展历史
一张图看懂图像识别算法发展历史
- 一图看懂新一代人工智能知识体系大全
来源:财经头条 摘要:人工智能的发展离不开基础支持层和技术层,基础支持层包括大数据.计算力和算法:技术层包括计算机视觉.语音识别和自然语言处理.人工智能的技术本质是什么,本文会详细分析. 人工智能的发 ...
- 一图看懂windows11新功能
[欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 微软Windows 11操作系统还没有正式推出,不过加入"预览体验计划"可以抢先体 ...
最新文章
- 说说Request.Params[key]和Request[key]
- 发力企业级市场,微软Hololens开辟了一条VR新道路
- java 初始化参数_我们如何在Java中的对象参数中初始化数组?
- JavaWeb: Redis存储Session方案
- Redis数据结构之有序集合
- ExtJs4.1目录结构介绍和使用说明[转]
- Mac安装Redis
- 全国计算机一级模拟软件安装教程
- IDEA eclipse快捷键大全
- NXP Zigbee 3.0标准网关开发复盘(JN5169)
- ComputeShader
- Codeforces Round #365 (Div. 2) C. Chris and Road(思维题-零点定理)
- java tcr,运动入门 通勤健身良伴 2019款 Giant TCR SL2 评测
- java.lang.InstantiationException: entity.User 实例化异常解决
- Python | 用Python制作送给女票的生日礼物
- c语言中英语部分,C语言部分函数(国外英语资料).doc
- 整车模型系列之变速器模型的建立
- 蓝桥杯-2020-Java-B组-装饰珠-动态规划
- linux下如何使用U盘拷文件
- 10 编译2022年最新的U-Boot v2023.01-rc2源码,并用QEMU模拟器运行