MVCC

MVCC (Multi-Version Concurrency Control) ,即多版本并发控制,利用记录的版本链和ReadView,来控制并发事务访问相同记录时的行为。ReadView即一致性视图,用来判断版本链中的哪个版本是当前事务可见的。

版本链

在每次更新该记录后,都会将旧值放到一条undo日志中。随着更新次数的增多,所有的版本都会被roll_pointer属性连接成一条链表,这个链表就称之为版本链。

ReadView包含的内容

  • m_ids 。在生成ReadView时,当前系统中活跃的读写事务的事务id列表,即还未提交。
  • min_trx_id 。在生成ReadView时,当前系统中活跃的读写事务中最小的事务id;也就是m_ids中 的最小值。
  • max_trx_id 。在生成ReadView时,系统应该分配给下一个事务的事务id值。
  • creator_trx_id 。生成该ReadView的事务的事务id。

如何通过ReadView来判断记录的某个版本是可见的?(小于、等于、不在、坚持回溯)

  • 如果trx_id == creator_trx_id,则表明当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。
  • 如果trx_id < min_trx_id,则表明生成该版本的事务在当前事务生成ReadView之前已经提交了,所以该版本可以被当前事务访问。
  • 如果trx_id >= max_trx_id,则表明生成该版本的事务在当前事务生成ReadView之后才开启,所以该版本不可以被当前事务访问。
  • 如果trx_id in m_ids,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问。
  • 如果trx_id not in m_ids,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。
  • 如果某个版本的数据对当前事务不可见,那就顺着版本链找到下一个版本的数据,并继续执行上面的步骤来判断记录的可见性,以此类推,直到版本链中的最后一个版本。

下面来测试一下以上理论:

ReadView生成的时机

  • READ COMMITTED和REPEATABLE READ隔离级别之间一个非常大的区别就是——它们生成ReadView的时机不同!!
  • READ COMMITTED——在一个事务中,每次读取数据前都生成一个ReadView。
  • REPEATABLE READ——在一个事务中,只在第一次读取数据时生成一个ReadView。

  • 两种情况下生成一个ReadView:

    • 情况①:RW的ids为【0,0】
    • 情况②:RW的ids为【10,0】
    • 情况③:RW的ids为【20】
    • 情况④:RW的ids为【】

每次读取数据前都生成一个ReadView,情况③时select操作,则由于已提交的trx_id=10<20,因此可以被看见,即发生了不可重复读的现象;而只在第一次读取数据时生成一个ReadView,由于事务1,2最开始读取的数据对应trx_id=2,小于10,因此即使此时去做select操作,也不会发生不可重复读的问题,这是可重复读的隔离级别的必然结果。

MVCC总结

MVCC是利用记录的版本链和ReadView,来控制并发事务访问相同记录时的行为。版本链就是roll_pointer连接的一条链表,RW可理解为事务id列表的几种id。MySQL就是通过RW的几种id与当前事务id作比较来判断目前事务id访问的版本是否可见,版本可见的情况包括:当前id小于、等于、不在RW版本链中,以及因为坚持回溯版本链最终到可见的地步,共四种情况。每次读取数据前都生成一个ReadView与只在第一次读取数据时生成一个ReadView分别对应了对已提交和可重复读的隔离级别。

 
 

MVCC原理的更多相关文章

  1. Mysql 中的MVCC原理,undo日志的依赖

    一. MVCC 原理了解   原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...

  2. Innodb 实现高并发、redo/undo MVCC原理

    一.并发控制   因为并发情况下有可能出现不同线程对同一资源进行变动,所以必须要对并发进行控制以保证数据的同一与安全.   可以参考CPython解释器中的GIL全局解释器锁,所以说python中没有 ...

  3. InnoDB实现MVCC原理

    ​ MVCC(Multi-Version Concurrent Control),即多版本并发控制,通过保存数据在某个时间点的快照来实现,因此每个读操作都会看到一个一致性的视图,并且可以实现非阻塞的读 ...

  4. 看一遍就懂:MVCC原理详解

    MVCC实现原理也是一道非常高频的面试题,自己在整理这篇文章的时候,感觉到网上的资料在讲这块知识点上写的五花八门,好像大家的理解并没有一致. 这里将自己所理解的做一个总结,个人会觉得这是一篇含金量挺高 ...

  5. 面试官:什么是MySQL 事务与 MVCC 原理?

    作者:小林coding 图解计算机基础网站:https://xiaolincoding.com/ 大家好,我是小林. 之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候, ...

  6. MySQL MVCC原理

    1 MVCC基本原理 MVCC:多版本并发控制(MVCC,Multiversion Currency Control).一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机 ...

  7. mysql MVCC原理理解

    MVCC多版本控制: 指的是一种提高并发的技术.最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞.引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了Inno ...

  8. MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的

    MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写.事物A 原子性C 一致性I 隔离性D 持久性高并发的场景下的问题脏读不可重复读幻读事物隔离级别RU读未提交 脏读/不可重复读/幻读 .不适用 ...

  9. MySQL MVCC原理深入探索

    一.MVCC的由来 二.MVCC的实际应用 RR级别场景 RC级别场景 三.MVCC的实现 3.1 多版本的数据从哪里来--Undo Log 3.1.1 插入操作对应的undo log 3.1.2 删 ...

  10. MVCC PostgreSQL实现事务和多版本并发控制的精华

    原创文章,同步发自作者个人博客,http://www.jasongj.com/sql/mvcc/ PostgreSQL针对ACID的实现机制 事务的实现原理可以解读为RDBMS采取何种技术确保事务的A ...

随机推荐

  1. Vim文本编码之坑

    #20220503更新# 今天又遇到一个问题,即常见的"cat显示正常,vi显示异常"的问题. 有这样一个文件,它的编码是UTF-16(DOS),在windows下用UltraEd ...

  2. C CODE STYLE 每天瞅一两眼

    阅读进度:只读到了swich 转载于:https://users.ece.cmu.edu/~eno/coding/CCodingStandard.html C Coding Standard C Co ...

  3. php8.0.0新功能:Match表达式

    Match表达式是基于值的一致性进行分支计算.它的比较是严格比较.Match表达式从php8.0.0起可用.示例代码: 1 $key = 'key_1'; 2 $value = match($key) ...

  4. .Net Core WebApi AutoFac用法

    1. 安装Autofac.Extensions.DependencyInjection管理包 UI层安装 2.在Program里面配置服务提供工厂 3.在Startup里面添加一个配置容器的方法 使用 ...

  5. composer 操作

    composer list 显示所有命令 composer show 显示所有包信息 composer install 在 composer.json 配置中添加依赖库之后运行此命令安装 compos ...

  6. servlet和spring框架的关系

    1.Servlet是什么? servlet就是一个Java接口,是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能. 由其他内部厂商如tomcat,JBoss内部实现web的功能. ...

  7. 可汗儿童版kids安卓版下载安装教程

    可汗儿童版kids安卓版幼儿版下载安装教程 点击下面 http://vip.ho27.com/Khan.apk 备用下载链接 天翼网盘下载安装就行 https://cloud.189.cn/t/6RV ...

  8. git入门123

    一.新手上路 最重要的4招: 1. 初始化本地仓库 git init 或者 git clone 远程仓库地址 2.添加改动文件 git add 改动的文件名或者目录 偷懒的话可以直接 git add ...

  9. Nginx+UWSGI+supervisor

    Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检 ...

  10. Centos系统修改时间临时和永久生效

    Centos系统,必须同时修改系统时间和硬件时间,才可以保证修改有效,单纯的使用date命令修改系统时间,是立即生效,重启后系统还原.具体操作如下: 1.date命令 {查看和修改目前系统本地的时间} ...