1.MVCC(Multiversion concurrency control) :多版本并发控制,当我们并发访问数据库(读或写)时,对事物内正在处理的数据做多版本控制,用以防止写操作的阻塞影响读操作的并发性能。

2.下面我们具体分析下在mysql中是如何对事物内处理的数据做多版本控制的。

上图表示数据库中的一张teacher表,表中我们定义了id,name,age三个字段。而后面多出来的两个字段DB_TRX_ID(数据行的版本号)和DB_ROLL_PT(删除版本号),就是数据库做多本版控制引入的两个字段。下面我们分析下数据库在对表中的数据进行操作时,这两个字段是如何变化的。

在mysql中有一个全局事物id的概念,可以理解为每开启一个事物,数据库都会给这个事物一个事物id,而且这个事物id是递增的。假设现在数据库的全局事物id为1,我们使用一个事物在teacher表中insert两条语句,即执行下面的语句,执行完成之后,插入的两条数据的数据行版本号为1,删除版本号为NULL。

begin;//开启一个事物

insert into teacher(name, age) value('seven',18);

insert into teacher(name, age) value('qingshan', 19);

commit;//提交事物

执行完上面的这个事物之后,数据库teacher表的状态变成了如下图。

假如我们现在要删除teacher表中id为2的这条数据,并且现在数据库的全局事物id已经到了22,即执行下面的事物。

begin;//开启事物

delete teacher where id = 2;

commit;

执行完上面的这个事物之后,数据库teacher表的状态变成了如下图。

假如现在我们要修改id为1的这条数据,并且全局事物id已经到了33。修改操作的大体执行过程是:将需要修改的数据行copy一份,copy过来的数据行版本号设为33,删除版本号为NULL,并更新数据。原始的数据行的删除版本号设置为33。执行下面的事物。

begin;//开始一个事物

update teacher set age = 19 where id = 1;

commit;

执行完上面的这个事物之后,数据库teacher表的状态变成了如下图。

现在假设我们需要查询teacher表中的数据,并且全局事物id已经到了44。查询的大体规则是:第一是要查找数据行的版本号小于或等于当前事物id,这样做可以确保查询的数据早于当前事物存在或者数据为当前事物插入。第二是查找删除版本号为NULL或者大于当前事物的版本号,这样做可以确保取出来的数据在事物开启之前没有被删除。

即执行以下事物。

begin;

select * from users;

commit;

执行完上面的这个事物之后,数据库teacher表的状态变成了如下图。

到这里我们基本上明白了MVCC的流程,现在我们通过MVCC的原理来分析一个例子。

就以我们上面介绍的teacher表中的两条数据为例,有下面两个事物。

tx1:

  begin;                      --1

  select * from teacher;              --2

  commit;  

tx2:

  begin;                      --3

  update teacher set age = 28 where id = 1;     --4

  commit;

上图是数据库现有的状态,假设我们执行 1 2 3 4 2,会经过下面的过程,我们尽量使用图来说明。

1 2步骤执行时,全局事物id为2,所以可以查找到id位1和2的两条数据,查找结果集为

  1 seven 18

  2 qingshan 20

3 4步骤执行时,全局事物id为3,执行之后数据库的状态变成了下图所示的状态。

在执行步骤2时,由于步骤2的全局事物id为2,所以会在表中查找数据行版本号小于2的,发现第一行和第二行满足记录,接下来查看删除版本号大于2或者为空的,发现第一行和第二行都满足记录,所以会返回结果集。

  1 seven 18

  2 qingshan 20。

上图是表的原始状态,假设我们上述执行的步骤不是1 2 3 4 2,而是步骤3 4 1 2,会是什么情况那。首先执行步骤3 4,执行完如图。

由于首先执行3 4,因此3 4的全局事物id为2,接下来我们执行步骤1 2,步骤1 2的全局事物id为3,我们开始查找数据行版本号小于3的,发现3行数据都满足要求,接下来查找删除版本号为空或者大于3的,发现最后两行满足要求,由此得到的结果集为。

  1 seven 28

  2 qingshan 20

说明:我们会发现一个问题,就是事物3读取到了事物2未提交的数据。也就是说如果一个读事物先于一个写事物发生,就不存在问题。但是如果一个写事物先发生,后面又有一个读事物,这种情况MVCC并没有解决由于并发访问导致的脏读问题。这个问题可以在看完undo log后得到解决。

mysql并发控制之MVCC的更多相关文章

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

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

  2. 五分钟详解MySQL并发控制及事务原理

    在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...

  3. MySQL锁与MVCC

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

  4. MySQL 多版本并发控制(MVCC)

    可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁的操作,因此开销会很低.主要实现的是非阻塞的读操作,写操作也只是锁定必要的行.MVCC的实现是通过保存数据在某个时间点的快照来实现的,也 ...

  5. mysql并发控制之快照读和当前读

    上一篇简单的介绍了下MVCC(多版本并发控制)的原理,MVCC会对事物内操作的数据做多版本控制,从而实现并发环境下事物对数据写操作的阻塞不影响读操作的性能.而这个多版本控制的实现是由undo log来 ...

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

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

  7. MySQL并发控制

    并发即指在同一时刻,多个操作并行执行.MySQL对并发的处理主要应用了两种机制——是“锁”和“多版本控制”. 锁 锁分为读锁和写锁两种,也称作共享锁和排他锁.因为多个读操作同时进行是不会破坏数据的,所 ...

  8. 温故知新-Mysql锁&事务&MVCC

    文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...

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

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

随机推荐

  1. June. 27th 2018, Week 26th. Wednesday

    To be great, truly great, you have to be the kind of person who makes the others around you great. 要 ...

  2. vue启动时候报错

    使用vue时,在已经安装模块完毕的情况下,依旧会报错,如: Module build failed: Error: %1 is not a valid Win32 application. 这个时候只 ...

  3. 蓝牙secure simple pair 概述

    Secure Simple Pairing,简称SSP,其流程主要分为六个部分: • IO capabilities exchange • Public key exchange • Authenti ...

  4. 【刷题】Git工作流-相关知识点

    参考资料:[学习总结]Git学习-GIT工作流-千峰教育(来自B站) 1-Git工作流 GitFlow流五大分支: 主干分支 热修复分支 预发布分支 开发分支 功能分支 GitFlow 工作流定义了一 ...

  5. Scrapy:腾讯招聘整站数据爬取

    项目地址:https://hr.tencent.com/ 步骤一.分析网站结构和待爬取内容 以下省略一万字 步骤二.上代码(不能略了) 1.配置items.py import scrapy class ...

  6. [转帖]""(双引号) 与''(单引号) 差在哪?

    ""(双引号) 与''(单引号) 差在哪? http://wiki.jikexueyuan.com/project/13-questions-of-shell/double-sin ...

  7. VScode插件以及配置

    Auto Rename Tag —— 自动同步修改标签 AutoFileName —— 自动补全路径提示 background —— 一个萌萌的插件,可以自己设置vsc的背景图 Bootstrap 3 ...

  8. Python 学习笔记 - 不断更新!

    Python 学习笔记 太久不写python,已经忘记以前学习的时候遇到了那些坑坑洼洼的地方了,开个帖子来记录一下,以供日后查阅. 摘要:一些报错:为啥Python没有自增 ++ 和自减 --: 0x ...

  9. [题解]邮递员寄信(luoguP1629)

    题目来源:luoguP1629 题目描述 有一个邮递员要送东西,邮局在结点1.他总共要送N-1样东西,其目的地分别是2-N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条 ...

  10. BZOJ3527[Zjoi2014]力——FFT

    题目描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei. 输入 第一行一个整数n. 接下来n行每行输入一个数,第i行表示qi. n≤100000,0<qi<100000 ...