概述

为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间(undolog),当事务提交之后将重做日志写入磁盘(前提innodb_flush_log_at_trx_commit为1)清空undolog,在5.6版本之后unodlog可以独立出共享表空间,引入MVCC的目的就是减少锁的挣用,通过阅读高性能mysql这本书的解释是MVCC是行级锁的一个变种,使大多数的读操作可以不用加锁,写操作也只锁定必要的行。。

正文

多版本并发控制只针对innodb的repeatable read和read committed这两种隔离级别。多版本并发控制的原理就是在每个记录行后面增加两个标示列用来存储该行的状态,分别存储改行的新系统版本号和删除系统版本号。系统的版本号会随着每增加一个事务递增。

TABLE

ID

NAME

Trx_id

De_Trx_id

1

a

1

有四个事务:select(trx=2),insert(trx=3),delete(trx=4),update(trx=5)

现在这四个事务同时对该行进行操作,演示SELECT的可重复读,假设四个操作在SLECT提交之前都未提交,当然SELECT是能查看到四个操作的记录的。

SELECT:

SELET会根据以下两个条件去查找记录,下面两个条件需要同时满足:

1.只查找行的系统版本号小于或等于当前事务版本号的记录行。

2.删除版本号为空或者大于当前事务版本号的记录行。

BEGIN TRAN

SELECT NAME FROM TABLE WHERE ID=1

ID

NAME

Trx_id

De_Trx_id

1

a

1

WAIT 10 MINUTE

SELECT NAME FROM TABLE WHERE ID=1

COMMIT

ID

NAME

Trx_id

De_Trx_id

1

a

1

4

根据SELECT 的查找条件INSERT记录的事务版本号大于当前版本号所以不会被查到;DELETE的事务删除版本号大于当前版本号,所以该行会被查出;UPDATE第一行的事务的版本号小于当前版本号而删除版本号大于当前版本号,可以被查到,第二行因为事务版本号大于当前版本号所以不满足,最终SELECT查询的记录是UPDATE操作的第一条记录;SELECT两次查询的结果一致,满足可重复读隔离级别。当然在这里除了INSERT操作,其它的操作都无法在SELECT提交之前提交。

INSERT:

INSERT INTO TABLE(ID,NAME) VALUES(2,'B');

ID

NAME

Trx_id

De_Trx_id

2

b

2

 

DELETE:

DELETE FROM TABLE WHERE ID=1;

ID

NAME

Trx_id

De_Trx_id

1

a

1

3

 

 

UPDATE:

BEGIN TRAN

UPDATE TABLE

SET NAME='B'

WHERE ID=1

COMMIT

 

ID

NAME

Trx_id

De_Trx_id

1

a

1

4

ID

NAME

Trx_id

De_Trx_id

1

b

4

注意:多版本并发控制不支持myisam存储引擎。

总结

在缓存中有一个用于维护锁的资源,对锁的维持需要消耗mysql的资源,多版本并发控制它就是减少了用于维持锁资源的消耗来提高性能,所以日志的写操作都是先undo再redo。

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

MySQL MVCC(多版本并发控制)的更多相关文章

  1. [MySQL] MVCC 多版本并发控制实现的事务

    1.没有一个统一的实现标准,实现了非阻塞的读操作,写操作也只锁定必要的行2.通过保存数据在某个时间点的快照实现的3.典型的有乐观并发控制和悲观并发控制4.innodb的mvcc是每次事务都有递增的版本 ...

  2. mysql的MVCC多版本并发控制机制

    MVCC多版本并发控制机制 全英文名:Multi-Version Concurrency Control MVCC不会通过加锁互斥来保证隔离性,避免频繁的加锁互斥. 而在串行化隔离级别为了保证较高的隔 ...

  3. Mysql InnoDB多版本并发控制MVCC

    参考书籍<mysql是怎样运行的> 系列文章目录和关于我 一丶为什么需要事务隔离级别 mysql是一个客户端/服务断软件,对于同一个服务器来说,可以有多个客户端进行连接,每一个客户端进行连 ...

  4. InnoDB学习(五)之MVCC多版本并发控制

    MVCC多版本并发控制,是一种数据库管理系统并发控制的方法.MVCC多版本并发控制下,数据库中的数据会有多个版本,分别对应不同的事务,从而达到事务之间并发数据的隔离.MVCC最大的优势是读不加锁,读写 ...

  5. MVCC多版本并发控制

    MVCC多版本并发控制 爱情小傻蛋关注 82019.09.28 23:23:37字数 4,740阅读 91,421 前提概要 什么是MVCC 什么是当前读和快照读? 当前读,快照读和MVCC的关系 M ...

  6. 【Mysql】深入理解 MVCC 多版本并发控制

    MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大, ...

  7. 针对MySQL的MVCC多版本并发控制的一些总结

    MVCC MVCC细节太多,我直接备忘一下总结: MVCC就是通过事务的ID与行数据的版本(修改事务的ID)进行比较(通过redo log可以回溯版本)得出哪些版本的行数据可见和不可见而实现的事务隔离 ...

  8. 聊聊MVCC多版本并发控制

    一.介绍 MVCC只在RR和RC 2个隔离级别下才能工作.MySQL的大多数事务存储引擎实现的都不是简单的行级锁机制.基于提升并发性能的考虑,它们一般都同时实现了MVCC. 通俗的来讲,MVCC是行级 ...

  9. MVCC多版本并发控制的理解

    前置知识 当前读与快照读 当前读 什么是当前读:读取的是最新的数据,不会读到老数据. 何时触发:update.insert.delete.select lock in share mode.selec ...

随机推荐

  1. Linux init

    -bash: netstat: command not found #pacman -S net-tools

  2. 相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)

    相机标定 一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标 ...

  3. 个人总结深入.NET平台和C#编程

    前言:学习C#编程应该有几个月了,作为一个菜鸟,没有资格来评论什么.只有对自己所学进行一个总结,可能有不严谨的地方,万望谅解.          一·深入.NET框架 .NET框架(.NET Fram ...

  4. Linux学习笔记(16)-多线程

    什么是多线程?或者说,什么是线程? 按照书本上的描述,所谓线程,便是包含在进程内部的顺序执行流,是进程中实际运作的单位,也是操作系统能够进行调度的最小单位. 一个进程中可以并发多条线程,每条线程并行执 ...

  5. hdu2662

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2662 莫名其妙写了一个题,感觉还是很有价值的记录一下. 题目大意:给两个互质的数,求用无限个它们不能组 ...

  6. orcal 操作

    清空表数据(不清除表结构): truncate table 表名

  7. 【算法杂谈】Miller-Rabin素性测试算法

    额,我们今天来讲一讲Miller-Rabin素性测试算法. 读者:怎么又是随机算法!!!(⊙o⊙)… [好了,言归正传] [费马小定理] 费马小定理只是个必要条件,符合费马小定理而非素数的数叫做Car ...

  8. 弱省互测#1 t3

    题意 给出一棵n个点的树,求包含1号点的第k小的连通块权值和.(\(n<=10^5\)) 分析 k小一般考虑堆... 题解 堆中关键字为\(s(x)+min(a)\),其中\(s(x)\)表示\ ...

  9. 移动web前端下拉刷新效果

    直接复制粘贴 放在页面中即可 <script> window.onload = function(){ window.addEventListener('touchstart', touc ...

  10. django _meta方法

    models.Book._meta.'concrete_model': <class 'books.models.Book'> models.Book._meta.'related_fke ...