12.1概述

  • 参考:MVCC实现原理
  • MVCC:mvcc多版本并发控制
  • 在mysql innodb中主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加索,非阻塞并发读
  • Mysql中的innoDB中就是使用这种方法来提高读写事务控制的、他大大提高了读写事务的并发性能,原因是MVCC是一种不采用锁来控制事物的方式,是一种非堵塞、同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。

12.2 实现原理

  • mvcc的实现是通过保存数据在某个时间点的快照来实现的。也就是说不管需要执行多长时间,每个事物看到的数据都是一致的。
  • mvcc可以解决脏读、不可重复读,使用快照读解决了部分幻读问题,但是在修改时还是使用当前读,所以还是存在幻读问题,幻读问题最终就是使用间隙锁解决。

12.3.mvcc解决那些问题?

  • 事务并发可能会产生以下问题:
  • 脏读:读取其它事务未提交的数据。
  • 不可重复读:一个事务在读取一条数据时,由于另一个事务修改了这条数据并且提交事务,再次读取时导致数据不一致
  • 幻读:一个事务读取了某个范围的数据,同时另一个事务新增了这个范围的数据,再次读取发现俩次得到的结果不一致。

12.4、当前读和快照读

  • 当前读:给读操作加上共享锁、排它锁,DML操作加上排它锁,这些都是当前读。当前读所读取的数据都是最新的,读取数据时加上锁,保证其它事物不能修改当前记录。

  • 快照读:快照读的数据有可能不是最新的,而是之前版本的数据。

  • 如何区分当前读和快照读

  • 不加锁的简单的select都属于快照读;与之对应的则是当前读,给select加上共享锁、排它锁。

12.5、mvcc底层实现要素

  • 在这之前需要知道MVCC只在REPEATABLE READ(可重复读) 和 READ COMMITTED(已读提交)这俩种隔离级别下适用。

  • mvcc实现原理是通过 隐藏字段(创建时版本号、回滚指针、删除版本号)、undo log 、Read view来实现的。

12.5.1、隐藏字段
  • 在Innodb存储引擎中,在有聚簇索引的情况下每一行记录中都会隐藏俩个字段,如果没有聚簇索引则还有一个6byte的隐藏主键。

  • 创建版本号:创建记录事务ID,记录事务id的DB_TRX_ID、大小为6bt

  • 删除版本号:删除/修改记录事务ID。这里只是将字段标记为删除状态。

  • 回滚指针:指向记录上一个版本

12.5.2、undo log
  • undo log 可以实现回滚操作来实现原子性,另外一个作用就是实现多版本控制 MVCC。

  • undo log细分为两种,insert时产生的undo log、update,delete时产生的undo log

  • 在Innodb中insert产生的undo log在提交事务之后就会被删除,在事务回滚时需要,因为新插入的数据没有历史版本,所以无需维护undo log。

  • update和delete操作产生的undo log都属于一种类型,在事务回滚时需要,而且在快照读时也需要,则需要维护多个版本信息。只有在快照读和事务回滚不涉及该日志时,对应的日志才会被purge线程统一删除。

  • purge线程会清理undo log的历史版本,同样也会清理del flag标记的记录。

  • undo log 在mvcc中的作用就是 undo log 保存一个版本链,也就是上面回滚指针字段连接的,实际上对MVCC有帮助的是update undo log、undo log实际就是存在rollback中的旧记录链。。

  • 当数据库执行select语句时会产生一致性试图read view。

  • read view是由查询时所有未提交事务ID组成的数组,数组中最小的事务ID为min_id和已创建的最大事务ID为max_id组成,查询的数据结果需要跟read-view做比较从而得到快照结果。

  • 所以说undo log在mvcc中的作用就是为了根据存储的事务ID和一致性视图做对比,从而得到快照结果。

12.5.3、read view

  • 当执行SQL语句查询时会产生一致性视图,也就是read-view,它是由查询的那一时间所有未提交事务ID组成的数组,和已经创建的最大事务ID组成的。

  • 在这个数组中最小的事务ID被称之为min_id,最大事务ID被称之为max_id,查询的数据结果要根据read-view做对比从而得到快照结果。

  • 于是就产生了以下的对比规则,这个规则就是使用当前的记录的trx_id跟read-view进行对比,对比规则如下。

12.5.3.1、版本链对比规则

  • 如果落在trx_id<min_id,表示此版本是已经提交的事务生成的,由于事务已经提交所以数据是可见的

  • 如果落在trx_id>max_id,表示此版本是由将来启动的事务生成的,是肯定不可见的

  • 若在min_id<=trx_id<=max_id时

    • 如果row的trx_id在数组中,表示此版本是由还没提交的事务生成的,不可见,但是当前自己的事务是可见的
    • 如果row的trx_id不在数组中,表明是提交的事务生成了该版本,可见
    • 在这里还有一个特殊情况那就是对于已经删除的数据,在之前的undo log日志讲述时说了update和delete是同一种类型的undo log,同样也可以认为delete就是update的特殊情况。
  • 当删除一条数据时会将版本链上最新的数据复制一份,然后将trx_id修改为删除时的trx_id,同时在该记录的头信息中存在一个delete flag标记,将这个标记写上true,用来表示当前记录已经删除。

  • 在查询时按照版本链的规则查询到对应的记录,如果delete flag标记位为true,意味着数据已经被删除,则不返回数据。

12.5.4 总结

  • 对当前读、快照读理解,简单点说加锁就是当前读,不加锁的就是快照读。
  • mvcc实现的三大要素俩个隐式字段、回滚日志、read-view
  • 俩个隐式字段:DB_TRX_ID:记录创建这条记录最后一次修改该记录的事务ID,DB_ROLL_PTR:回滚指针,指向这条记录的上一个版本
  • undo log在更新数据时会产生版本链,是read-view获取数据的前提
  • read-view当SQL执行查询语句时产生的,是由为提交的事务ID组成的数组和创建的最大事务ID组成的

Mysql基础11-MVCC机制相关推荐

  1. MySQL - 多版本控制 MVCC 机制初探

    文章目录 生猛干货 MVCC (Multi-Version Concurrency Control)原理 快照读与当前读 MVCC 多版本实现 总结 搞定MySQL 生猛干货 带你搞定MySQL实战, ...

  2. 认真学习MySQL中的MVCC机制

    什么是MVCC?MVCC(Multiversion Concurrency Control),多版本并发控制.顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制.这项技术使得在Inno ...

  3. Mysql锁与MVCC机制

    我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写.脏读.不可重复读.幻读这些问题. 这些问题的本质都是数据库的多事务并发问题,为了解 ...

  4. Mysql事务隔离MVCC机制

    MVCC是Mysql保证可重复读和读已提交两个级别的隔离性用到的一套机制,串行化执行是通过加锁来实现的,而MVCC机制下在对同一行数据进行读和写时,不会直接加锁互斥. MVCC主要由undo日志版本链 ...

  5. mysql中的mvcc机制

    MVCC多版本并发控制 简述MySQL锁 在InnoDB引擎下,按锁的粒度分类,可以分为行锁和表锁. 行锁实际上是作用在索引之上的.当我们的SQL命中了索引,那锁住的就是命中条件内的索引节点(这就是行 ...

  6. 面试系列MySql:谈谈MVCC机制的理解

    介绍 MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题. 举例 ...

  7. java基础巩固-宇宙第一AiYWM:为了维持生计,MySQL基础Part2(MVCC、存储过程、触发器、编码方式及字符集、多表连接,内外连接,子查询、自联结、视图、设计DB、三范式)~整起

    PART1:

  8. MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  9. MySQL基础篇(06):事务管理,锁机制案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.锁概念简介 1.基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题.锁机制是一个非常大的模块,贯彻MyS ...

  10. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

最新文章

  1. Hadoop机架感知与balancer
  2. 回归架构本真:从规划、思维到设计,构建坚不可摧的架构根基
  3. 一次服务器CPU占用率高的定位分析
  4. 虚拟机安装以及PCL的配置(1)
  5. imx6 android SD卡启动
  6. Office Word界面和页面字体模糊不清的解决方案
  7. java之七 高级类设计
  8. java密码学原型算法_java密码学原型算法实现——双线性对.pdf
  9. Window上安装kafka
  10. java几种遍历方式以及效率对比
  11. 我的docker随笔22:多域名同主机部署
  12. 超级大水题(还是自己过不了的水题)
  13. Linux下服务器搭建(7)——Oracle Linux ISO Images 高速镜像源下载地址(各版本齐全 建议收藏 最后更新2020.07.22)
  14. Start Developing iOS Apps Today系列之应用程序(七)
  15. Javascript单例模式概念与实例
  16. 业务系统需要不同浏览器打开解决方式
  17. 证券公司八大业务最全梳理
  18. 可靠性计算python库
  19. Java生鲜电商平台-微服务生鲜电商用户中心的系统设计(小程序/APP)
  20. 服务器安装内置无线网卡,笔记本怎么安装内置网卡 笔记本内置无线网卡安装步骤【图文】...

热门文章

  1. Linux环境变量配置全攻略
  2. 动态网格与自动拓扑的区别
  3. 七牛云对象存储空间绑定自己的域名
  4. flask项目开发到部署笔记
  5. Java 面向对象特征
  6. Java Web基础入门第八讲 Java Web开发入门——初始WEB服务器
  7. 青年大学习未学习人员名单查询
  8. 是什么的简称_王者荣耀玩家灵魂发问:鲁班7号简称鲁班,那鲁班大师该叫什么?...
  9. 基于java的搜索引擎系统设计与实现(项目报告+开题报告+答辩PPT+源代码+数据库+部署视频)
  10. 解决多个app共用一个universal links的问题 / apple-app-site-association / 不想用uniapp提供的云服务 / iOS唤起自家App