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后得到解决。

转载于:https://www.cnblogs.com/code-star/p/10692031.html

mysql并发控制之MVCC相关推荐

  1. 事物的级别_浅谈MySQL并发控制:隔离级别、锁与MVCC

    推荐阅读: 恕我直言!收藏这个MySQL文档,你其余的MySQL学习资料都可以扔了 前言 如果数据库中的事务都是串行执行的,这种方式可以保障事务的执行不会出现异常和错误,但带来的问题是串行执行会带来性 ...

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

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

  3. fetch first mysql_MySQL多版本并发控制机制(MVCC)源码浅析

    MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<>诚然讲的非常透彻,但只能提纲挈领,不能让 ...

  4. MySQL ACID与MVCC浅谈

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

  5. mysql中的mvcc机制

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

  6. 通俗易懂的MySQL事务及MVCC原理,我先收藏了!

    一.事务简介与四大特性 事务指的是一组命令操作,在执行的过程中,要么全部成功,要么全部失败. 由引擎层支持事务,MyISAM就不支持事务,而InnoDB是支持事务的. 事务具有以下四大特性(ACID) ...

  7. mysql 设置mvcc_MySQL MVCC

    前提概要 什么是MVCC? MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制.MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数 ...

  8. Mysql 中的 mvcc原理

    目录 什么是mvcc? 什么是快照读,和当前读? mvcc的作用? mvcc的实现原理? RC,RR下的inoodb有什么不同? 什么是mvcc? MVCC,全称Multi-Version Concu ...

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

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

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

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

最新文章

  1. LISP 圆孔标记_晓东CAD家园-论坛-A/VLISP-获取当前标注样式-;;希望大家来完善它 - Powered by Discuz!...
  2. Google发布三大新品,Pixel手机价格直逼苹果
  3. 五分钟体验SpringBoot+Skywalking
  4. 提升Android开发效率的最佳实践
  5. 【shell】Linux shell 之 判断用户输入的变量是否为数字
  6. PHP如何安装和配置Zend Studio
  7. mysql instead of_mysqluniqueoptionprefixmyisam_recoverinsteadofmyisam-recover-options的解决方法
  8. 几个实用的Servlet应用例子-入门、cookie、session及上传文件
  9. python 硬件自动化测试_村长告诉你:Python实现性能自动化测试竟然如此简单
  10. 免费学python的网课-这些 AI 课网课最具人气!不仅免费、系统,还附带链接 | 资源...
  11. 准确率(accuracy),精确率(Precision),召回率(Recall)和F1-Measure
  12. 弦图(Chordal Graph)学习小记
  13. C#获取本地IP地址
  14. 海康存储服务器虚拟机,unraid 安装虚拟机攻略
  15. 3Dmax入门篇,常用快捷命令及两种基础建模方式,小白看了都会!
  16. .net 大型药品进销存管理系统源码
  17. vscode 结束_VSCode C++ 运行结束马上退出, 窗口一闪而过解决办法, 不修改代码
  18. 台资企业管理职的中英文称谓以及级别
  19. Proxmox VE安装、集群配置
  20. 【PHPWord】基于Word模板替换生成输出表格动态生成内容、合并单元格、设置单元格背景颜色

热门文章

  1. vue-devtools 使用
  2. Markdown(四)——绘图工具mermaid之状态图stateDiagram
  3. 递归的应用之字符串反转
  4. Synopsys MetaWare for Linux 安装与编译指南
  5. vim怎么把一个写的代码文件另存到任意文件夹里?
  6. Codeforces Round #564 (Div. 2) A. Nauuo and Votes
  7. 使用 nginx 搭建简易文件服务器
  8. python多线程与多进程
  9. PL/SQL学习笔记之存储过程
  10. 世纪互联蓝云柯文达:与更多海外云服务商共赢中国市场