mysql并发控制之MVCC
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的更多相关文章
- MySQL多版本并发控制机制(MVCC)-源码浅析
MySQL多版本并发控制机制(MVCC)-源码浅析 前言 作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾.<<事务处理-概念与技术>>诚然 ...
- 五分钟详解MySQL并发控制及事务原理
在如今互联网业务中使用范围最广的数据库无疑还是关系型数据库MySQL,之所以用"还是"这个词,是因为最近几年国内数据库领域也取得了一些长足进步,例如以TIDB.OceanBase等 ...
- MySQL锁与MVCC
--MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...
- MySQL 多版本并发控制(MVCC)
可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁的操作,因此开销会很低.主要实现的是非阻塞的读操作,写操作也只是锁定必要的行.MVCC的实现是通过保存数据在某个时间点的快照来实现的,也 ...
- mysql并发控制之快照读和当前读
上一篇简单的介绍了下MVCC(多版本并发控制)的原理,MVCC会对事物内操作的数据做多版本控制,从而实现并发环境下事物对数据写操作的阻塞不影响读操作的性能.而这个多版本控制的实现是由undo log来 ...
- Mysql 中的MVCC原理,undo日志的依赖
一. MVCC 原理了解 原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...
- MySQL并发控制
并发即指在同一时刻,多个操作并行执行.MySQL对并发的处理主要应用了两种机制——是“锁”和“多版本控制”. 锁 锁分为读锁和写锁两种,也称作共享锁和排他锁.因为多个读操作同时进行是不会破坏数据的,所 ...
- 温故知新-Mysql锁&事务&MVCC
文章目录 锁概述 锁分类 MyISAM 表锁 InnoDB 行锁 事务及其ACID属性 InnoDB 的行锁模式 注意 MVCC InnoDB 中的 MVCC 参考 你的鼓励也是我创作的动力 Post ...
- 面试官:什么是MySQL 事务与 MVCC 原理?
作者:小林coding 图解计算机基础网站:https://xiaolincoding.com/ 大家好,我是小林. 之前写过一篇 MySQL 的 MVCC 的工作原理,最近有读者在网站上学习的时候, ...
随机推荐
- 网络流 之 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- mongo 监听指定语句
class Program { private static string conn = "mongodb://47.104.206.56:27017"; //数据库名称 priv ...
- 毕业设计(1)基于MicroPython的大棚监测控制系统的程序设计与模型设计
智慧农业就是将物联网技术运用到传统农业中去,运用传感器和软件通过移动平台或者电脑平台对农业生产进行控制,使传统农业更具有“智慧”.除了精准感知.控制与决策管理外,从广泛意义上讲,智慧农业还包括农业电子 ...
- [题解]玩具谜题(toy)
玩具谜题(toy) 来源:noip2016 提高组 day1 [题目描述] 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个 ...
- https 自签名SSL证书
介绍 TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议. 使用这种技术,服务器可以在服务器和客户端之间安全地发送流量,而不会被外部各方拦截 ...
- Adding appsettings.json to a .NET Core console app
This is something that strangely doesn’t seem to be that well documented and took me a while to figu ...
- Glide和Picasso的区别
首先简单的介绍下两个库的出身: Picasso是Square公司出品的一款非常优秀的开源图片加载库Glide是由Google开发,基于 Picasso,依然有保存了Picasso的简洁风格,但是在此做 ...
- 修改MAC地址的方法 破解MAC地址绑定(抄)
修改MAC地址的方法 破解MAC地址绑定 网卡的MAC地址是固化在网上EPROM中的物理地址,是一块网卡的“身份证”,通常为48位.在平常的应用中,有很多方面与MAC地址相关,如有些软件是和MAC ...
- Xcode 打包(Shell)
1. xcodebuild 1.1 查当前可用的 sdk $xcodebuild -showsdks 1.2 查看所支持的target $xcodebuild -target 1.2 清空当前编译的a ...
- TsinsenA1489 抽奖 【期望】
题目分析: 问题可以转化成将m个球放进n个盒子里,每个盒子的贡献为盒子中球数的平方. 第一问考虑增量. 对于一个原本有$x$个球的盒子,新加一个球的贡献是$2x+1$.期望条件下仍然满足. 第$i$个 ...