说起事务隔离级别和各自解决的问题,相信学过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系列】相关推荐

  1. 一张图看懂2017双11中的网络产品和技术

    摘要: 大家都知道,2017年双11又创造了新纪录,全天交易额1682亿,交易峰值32.5万笔/秒,支付峰值25.6W笔/秒,狂欢的背后是极其复杂庞大的技术系统,其中就有大量阿里云云计算相关的产品和技 ...

  2. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  3. 一张图看懂微服务架构路线

    目录 一张图看懂微服务架构路线 我为什么选择微服务架构? 微服务架构路线 基本思路 Docker 容器编排 Docker 容器管理 API网关 负载均衡 服务发现 事件总线 日志记录 监控和警报 分布 ...

  4. 【重磅】一图看懂阿里云两个新大脑:ET 医疗大脑和 ET 工业大脑

    3月27日至29日,阿里云2017年第一场云栖大会在深圳拉开帷幕.29日上午的主题演讲由阿里巴巴副总裁.阿里云总裁胡晓明带来.在题为<通往智能之路>的演讲中,他与现场数百名开发者.媒体和合 ...

  5. 一张脑图看懂BUI Webapp移动快速开发框架【上】--框架与工具、资源

    前言 之前写过一篇 2018开发最快的Webapp框架--BUI交互框架 ,如果你还没看过,可以简单看一下,主要介绍了BUI的基本功能,有多少控件,以及实现的思路,BUI 1.5版本以后变化很大,统一 ...

  6. 网络协议——一张图看懂网络分层

    目录 一.四个问题 二.网络为什么分层? 三.程序时如何工作的 3.1 一张图看懂工作过程 3.2 接受包 3.3 发起请求 四.层与层之间的关系 一.四个问题 1. TCP进行三次握手时,IP层和M ...

  7. 一张图看懂图像识别算法发展历史

    一张图看懂图像识别算法发展历史

  8. 一图看懂新一代人工智能知识体系大全

    来源:财经头条 摘要:人工智能的发展离不开基础支持层和技术层,基础支持层包括大数据.计算力和算法:技术层包括计算机视觉.语音识别和自然语言处理.人工智能的技术本质是什么,本文会详细分析. 人工智能的发 ...

  9. 一图看懂windows11新功能

    [欢迎关注微信公众号:厦门微思网络] 微思网络(官网):https://www.xmws.cn/ 微软Windows 11操作系统还没有正式推出,不过加入"预览体验计划"可以抢先体 ...

最新文章

  1. 说说Request.Params[key]和Request[key]
  2. 发力企业级市场,微软Hololens开辟了一条VR新道路
  3. java 初始化参数_我们如何在Java中的对象参数中初始化数组?
  4. JavaWeb: Redis存储Session方案
  5. Redis数据结构之有序集合
  6. ExtJs4.1目录结构介绍和使用说明[转]
  7. Mac安装Redis
  8. 全国计算机一级模拟软件安装教程
  9. IDEA eclipse快捷键大全
  10. NXP Zigbee 3.0标准网关开发复盘(JN5169)
  11. ComputeShader
  12. Codeforces Round #365 (Div. 2) C. Chris and Road(思维题-零点定理)
  13. java tcr,运动入门 通勤健身良伴 2019款 Giant TCR SL2 评测
  14. java.lang.InstantiationException: entity.User 实例化异常解决
  15. Python | 用Python制作送给女票的生日礼物
  16. c语言中英语部分,C语言部分函数(国外英语资料).doc
  17. 整车模型系列之变速器模型的建立
  18. 蓝桥杯-2020-Java-B组-装饰珠-动态规划
  19. linux下如何使用U盘拷文件
  20. 10 编译2022年最新的U-Boot v2023.01-rc2源码,并用QEMU模拟器运行

热门文章

  1. leetcode系列-颜色分类(sort colors)
  2. 什么是通达信服务接口?
  3. postgis导入导出shp文件
  4. java基本类型封装类和原始类型的区别及好处
  5. 图像保边滤波器集锦---各向异性扩散滤波(Anisotropic Filter)算法与实现
  6. 南京印象之夜色下的秦淮河
  7. 黄桃罐头有营养吗?怎么做?
  8. 互联网寒冬下,在校生如何寻找自己的定位?
  9. [Android开发] app在华为手机的应用市场和安装时候显示未兼容android7.0
  10. 流媒体之从零实现搭建简单流媒体服务器,推流,拉流播放全景视频