本文由sysdb授权转发

数据多版本(MVCC)是MySQL实现高性能的一个主要的一个主要方式,通过对普通的SELECT不加锁,直接利用MVCC读取指版本的值,避免了对数据重复加锁的过程,今天我们就用最简单的方式,来分析下MVCC具体的原理,先解释几个概念:

隐藏列

在分析MVCC原理之前,先看下InnoDB中数据行的结构:

在InnoDB中,每一行都有2个隐藏列DATA_TRX_ID和DATA_ROLL_PTR(如果没有定义主键,则还有个隐藏主键列):

DATA_TRX_ID表示最近修改该行数据的事务ID

DATA_ROLL_PTR则表示指向该行回滚段的指针,该行上所有旧的版本,在undo中都通过链表的形式组织,而该值,正式指向undo中该行的历史记录链表

整个MVCC的关键就是通过DATA_TRX_ID和DATA_ROLL_PTR这两个隐藏列来实现的。

事务链表

MySQL中的事务在开始到提交这段过程中,都会被保存到一个叫trx_sys的事务链表中,这是一个基本的链表结构:

事务链表中保存的都是还未提交的事务,事务一旦被提交,则会被从事务链表中摘除。

ReadView

有了前面隐藏列和事务链表的基础,接下去就可以构造MySQL实现MVCC的关键——ReadView。

ReadView说白了就是一个数据结构,在事务开始的时候被创建。这个数据结构中包含了3个主要的成员:ReadView{low_trx_id, up_trx_id, trx_ids},在并发情况下,一个事务在启动时,trx_sys链表中存在部分还未提交的事务,那么哪些改变对当前事务是可见的,哪些又是不可见的,这个需要通过ReadView来进行判定,首先来看下ReadView中的3个成员各自代表的意思:

low_trx_id表示该事务启动时,当前事务链表中最大的事务id编号,也就是最近创建的除自身以外最大事务编号;

up_trx_id表示该事务启动时,当前事务链表中最小的事务id编号,也就是当前系统中创建最早但还未提交的事务;

trx_ids表示所有事务链表中事务的id集合。

上述3个成员组成了ReadView中的主要部分,简单图示如下:

根据上图所示,所有数据行上DATA_TRX_ID小于up_trx_id的记录,说明修改该行的事务在当前事务开启之前都已经提交完成,所以对当前事务来说,都是可见的。而对于DATA_TRX_ID大于low_trx_id的记录,说明修改该行记录的事务在当前事务之后,所以对于当前事务来说是不可见的。至于位于(up_trx_id, low_trx_id)中间的事务是否可见,这个需要根据不同的事务隔离级别来确定。对于RC的事务隔离级别来说,对于事务执行过程中,已经提交的事务的数据,对当前事务是可见的,也就是说上述图中,当前事务运行过程中,trx1~4中任意一个事务提交,对当前事务来说都是可见的;而对于RR隔离级别来说,事务启动时,已经开始的事务链表中的事务的所有修改都是不可见的,所以在RR级别下,low_trx_id基本保持与up_trx_id相同的值即可。

最后用一张图来解释MySQL中的MVCC实现:

mysql mvcc readview_MySQL MVCC实现相关推荐

  1. MySQL ACID与MVCC浅谈

    MySQL ACID与MVCC浅谈 前言 我们都知道在做事务的概念,就是一个完整的操作动作要么都执行,要么都不执行,这是一个不可分割的工作单位,ACID又是事务的四大特征.那么ACID具体是什么呢? ...

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

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

  3. mysql mvcc update_MySql MVCC机制

    Multiversion concurrency control 多版本并发控制 并发访问(读或者写)数据库时,对正在事务内处理的数据做多版本的管理,用来避免由于写操作的堵塞,而引发读操作失败的并发问 ...

  4. mysql中的mvcc机制

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

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

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

  6. MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁

    文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开lock和latch ...

  7. MySQL高级理论-MVCC提交查询相关(版本链)

    首先要介绍几个概念: 1.    MVCC(Multi-Version Concurren):多版本并发控制,是MySQL的事务型存储引擎如InnoDB. 2.    trx_id与roll_poin ...

  8. 腾讯面试:MySQL事务与MVCC如何实现的隔离级别?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

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

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

最新文章

  1. js 识别汉字和全角字符
  2. Linux中的Screen命令使用技巧详解
  3. Http Tunnel 小记
  4. 《C++入门经典(第6版)》——1.5 问与答
  5. TensorFlow——加载和使用多个模型解决方案
  6. android 子module混淆_Android 矢量图详解
  7. unix linux 命令参考,Unix/Linux 命令参考
  8. 神经网络 梯度下降_梯度下降优化器对神经网络训练的影响
  9. Educational Codeforces Round 101 (Rated for Div. 2) F. Power Sockets 哈希 + 乱搞
  10. C++学习笔记(一)
  11. [css] 如何使用伪元素实现增大点击热区来增加用户体验?
  12. python 多线程 popen ping指定IP是否在线 判断连通
  13. 硬核干货,老曹解密“语音交互”背后的黑科技!
  14. 九零后女孩币圈变形记
  15. Linux下运行java DES AES加解密
  16. Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 54; columnNumbe
  17. Firefox扩展IE Tab Plus内置功能导致浏览所有网页加载superfish.com脚本
  18. java 序列号怎么获取,Java获得硬盘和主板的序列号代码
  19. 如何有效管理项目进度?管控关键里程碑?
  20. 论文-Interactive Path Reasoning on Graph for Conversational Recommendation

热门文章

  1. android 项目 功能 源码 eclipse的
  2. 前端学HTTP之客户端识别和cookie
  3. SQL性能优化常见措施(Lock wait timeout exceeded)
  4. 【C++】日期类+日期万年历+日期计算器
  5. CentOS上安装man手册
  6. sqlserver2008索引优化的相关研究(一)
  7. Ubuntu 12.04 eclipse 安装 svn插件
  8. 9-14 ruby环境准备 操作
  9. 客户端压测server端计算qps以及不同延迟时间下响应数量所占百分比
  10. 18muduo_base库源码分析(九)