1. MVCC简介

1.1 什么是MVCC

  MVCC(Multiversion concurrency control )是一种多版本并发控制机制。

1.2 MVCC是为了解决什么问题?

  并发访问(读或写)数据库时,对正在事务内处理的数据做多版本的管理。以达到用来避免写操作的堵塞,从而引发读操作的并发问题。
  大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销。

1.3 MVCC实现

  MVCC是通过保存数据在某个时间点的快照来实现的。不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制。当我们创建表完成后,mysql会自动为每个表添加 数据版本号(最后更新数据的事务id)db_trx_id 删除版本号 db_roll_pt (数据删除的事务id) 事务id由mysql数据库自动生成,且递增。

2.MVCC 具体实现分析

2.1 MVCC逻辑流程-插入(insert)

  如下图,同一事务中(假设事务id=1)插入两条记录,记录的数据版本号为事务id=1,删除版本号为null

start transaction;(事务id为1)
INSERT INTO user (name,sex) VALUES ('张三','男');
INSERT INTO user (name,sex) VALUES ('李四','男');
commit;

  对应在数据中的表如下(后面两列是隐藏列,我们通过查询语句并看不到)

  

2.2 MVCC逻辑流程-查询(select)

  查询时需要同时满足以下两个条件
  1、查找数据版本号,早于(小于等于)当前事务id的数据行。 这样可以确保事务读取的数据是事务之前已经存在的。或者是当前事务插入或修改的。
  2、查找删除版本号为null 或者大于当前事务版本号的记录。 这样确保取出来的数据在当前事务开启之前没有被删除。

  如下图,假如有一个事务中执行查询(假设事务id=2)

start transaction;(事务id为2)
select * from user where sex = '男'; --(1)
select * from user where sex = '男'; --(2)
commit;

  假设在执行这个事务ID为2的过程中,刚执行到(1),这时有另一个事务(假设事务id=3)往这个表里插入了一条数据;

start transaction;(事务id为3)
INSERT INTO user (name,sex) VALUES ('王五','男');
commit;

  此时表中的数据如下:

  

  然后接着执行事务 id=2 中的(2),由于id=3的数据的创建时间(事务ID为3),执行当前事务的ID为2,而InnoDB只会查找事务ID小于等于当前事务ID的数据行,所以 id=3 的数据行并不会在执行事务 id=2 中的 (2) 被检索出来。在事务 id=2 中的两条select 语句检索出来的数据都只会下表:

  

2.3 MVCC逻辑流程-删除(delete)

  如下图,假如有一个事务中执行查询(假设事务id=4)

start transaction;(事务id为4)
select * from user where sex = '男'; --(1)
select * from user where sex = '男'; --(2)
commit;

  假设事务 id=4 刚执行到(1),此时有另外一个事务 id=5 执行了删除语句,会更新数据的删除版本号为当前事务id = 5 

start transaction;(事务id为5)
DELETE FROM user WHERE id = 1;
commit;

  此时数据库表中数据如下:

  

  接着执行事务 id=4的事务(2),根据SELECT 检索条件可以知道,它会检索创建时间(创建事务的ID)小于当前事务ID的行和删除时间(删除事务的ID)大于当前事务的行,表中id=1的行由于删除时间(删除事务的ID)大于当前事务的ID,所以事务 id=2 的(2)在执行的时候也会把表中 id=1 的数据检索出来,所以事务4中的两条select 语句检索出来的数据都如下:

  

2.4 MVCC逻辑流程-修改(update)

  可以理解为,当一个事务中 修改一条记录时, 是先复制该数据,新数据数据版本号为当前事务id,删除版本号为 null 。然后更新 原来数据的删除版本号为 当前事务id。如下:

  假如一个事务 id=6 执行了一条update语句

start transaction;(事务id为6)
UPDATE user SET name='李四1' WHERE id = 2
commit;

  执行结果如下:

  

MVCC实现机制的更多相关文章

  1. 轻松理解MYSQL MVCC 实现机制

    轻松理解MYSQL MVCC 实现机制 转载https://blog.csdn.net/whoamiyang/article/details/51901888 1. MVCC简介 1.1 什么是MVC ...

  2. innodb mvcc实现机制

    多版本并发控制 大部分的MySQL的存储 引擎,比如InnoDB,Falcon,以及PBXT并不是简简单单的使用行锁机制.它们都使用了行锁结合一种提高并发的技术,被称为MVCC(多版本并 发控制).M ...

  3. MySQL多版本并发控制机制(MVCC)-源码浅析

    MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<事务处理-概念与技术>>诚然 ...

  4. 一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...

  5. mysql锁机制总结

    1.隔离级别 (1)读不提交(Read Uncommited,RU) 这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. (2)读提交(Read commited ...

  6. mysql MVCC

    InnoDB多版本(MVCC)实现简要分析 MVCC实现-MySQL Innodb MVCC实现 MVCC浅析 mysql的mvcc(多版本并发控制) mysql innodb mvcc 读一致性(R ...

  7. 多版本号并发控制(MVCC)在分布式系统中的应用

    QQ群:289150599 问题 近期项目中遇到了一个分布式系统的并发控制问题.该问题能够抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 ... Ln组成:D本质上是一个key-va ...

  8. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  9. UNDO及MVCC、崩溃恢复

    UNDO特性:避免脏读.事务回滚.非阻塞读.MVCC.崩溃恢复 事务工作流程(图2) MVCC原理机制 崩溃恢复:redo前滚.undo回滚 长事务.大事务:危害.判断.处理 UNDO优化:实现und ...

随机推荐

  1. 异常处理(Exception Handling)

    java里的异常处理(Exception)Exception 是在程序执行过程中发生的一些不希望发生的事情,这些事情如果不被好好处理,就会导致奇怪的结果或者是程序终结.Exception Handle ...

  2. hive序列化和反序列化serde

    一.简介 SerDe是Serializer/Deserializer的缩写.SerDe允许Hive读取表中的数据,并将其以任何自定义格式写回HDFS. 任何人都可以为自己的数据格式编写自己的SerDe ...

  3. leetcode题目4.寻找两个有序数组的中位数(困难)

    题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和  ...

  4. Linux 下运行 class 文件

    1. 基本命令 java  -cp  searchDir  classFile -cp  searchDir : 指定从该目录搜索 class 文件 classFile :类路径(不包含 .class ...

  5. 邻居子系统 之 邻居表的初始化neigh_table_init

    概述 邻居子系统支持多种实现,例如ARP,ND等,这些实现需要在其初始化的时候,调用neigh_table_init将邻居表项添加到全局邻居子系统数组中,并对实例中的字段(如hash,定时器等)进行相 ...

  6. 浅析VxWorks与Linux操作系统的区别

        版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/flaoter/article/details/76861710 转载请标明出处floater ...

  7. pytorch的matmul怎么广播

    1)如果是两个1维的,就向量内积:2)如果两个都是2维的,就矩阵相乘3)如果第一个是1维,第二个是2维:填充第一个使得能够和第二个参数相乘:如果第一个是2维,第二个是1维,就是矩阵和向量相乘:例: a ...

  8. javascript之Prototype属性

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. NDk的目录

    * docs : 开发文档* build: linux下编译的批处理命令* platform : 某种平台下编译需要的头文件和函数库* prebuild : 预编译的工具* sample: 实例代码* ...

  10. [Hibernate]知识点

    本笔记只介绍注解的方法 一.准备工作: a.添加三个pojo类: Product: package pojo; import javax.persistence.*; import java.util ...