MVCC

1、MVCC简介

1.1 什么是MVCC

MVCC(全称Multi-Version Concurrent Control)是一种多版本并发控制机制。

1.2 MVCC是为了解决什么问题

  • 大多数MYSQL事务型存储引擎,如InnoDB, Falcon以及PBXT都不使用一种简单的行锁机制。事实上,他们都和MVCC多版本控制一起来使用。
  • 锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC能降低其系统开销。

1.3 MVCC实现

MVCC是通过保存数据在某个时间点的快照来实现的。不同存储引擎的MVCC实现不同,典型的有乐观并发控制和悲观并发开销。

2、MVCC 具体实现

Innodb的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了这个行的创建时间,另一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号,每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID。下面看一下在REPEATABLE READ 隔离级别下,MVCC具体是如何操作的。

2.1 简单的例子

create table user (
uid int primary key auto_increment,
name varchar(20));
  • INSERT
    InnoDB为新插入的每一行保存当前系统版本号作为版本号。假设系统的版本号从1开始,第一个事务ID为1.
start transaction;
insert into user values(NULL, 'Hans');
insert into user values(NULL, 'Will');
insert into user values(NULL, 'Jack');
commit;

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

uid name 创建时间(事务ID) 删除时间(事务ID)
1 Hans 1 undefined
2 Will 1 undefined
3 Jack 1 undefined
  • SELECT
    InnoDB会根据以下两个条件检查每行记录,查询结果必须同时满足这两个条件。
    1、InnoDB只会查找版本早于当前事务版本的数据行(即行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在,要么是事务自身插入或修改过。
    2、行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除。

  • DELETE
    InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识。
    第二个事务,ID为2

start transaction;
select * from user;  //(s 1)
select * from user;  //(s 2)
commit;

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

start transaction;
insert into user values(NULL, 'Charles');
commit;

这时表中数据如下:

uid name 创建时间() 删除时间()
1 Hans 1 undefined
2 Will 1 undefined
3 Jack 1 undefined
4 Charles 3 undefined

由于user表uid=4的数据创建时间事务ID为3,执行当前事务的ID为2,而InnoDB只会查找事务ID小于等于当前事务ID的数据行,所以uid=4的数据在执行事务2中的(s 2)时不会被检索出来。

假设2
假设子啊执行事务ID为2的过程中,刚执行到(s 1),事务执行完事务3后,有执行事务4:

start transaction;
delete from user where id=1;
commit;

此时数据表如下:

uid name 创建时间() 删除时间()
1 Hans 1 4
2 Will 1 undefined
3 Jack 1 undefined
4 Charles 3 undefined

接着执行事务ID为2的事务(s 2),根据select检索条件知道,它只会检索创建时间小于当前事务ID和删除时间大于当前事务的行。检索出数据如下:

uid name 创建时间() 删除时间()
1 Hans 1 4
2 Will 1 undefined
3 Jack 1 undefined
  • UPDATE
    InnoDB执行UPDATE,实际上市新插入了一行记录,并保存期创建时间为当前事务的ID,同时保存当前事务ID到要UPDATE的行的删除时间。
    假设3
    假设在执行完事务2的(s 1)后,其他用户执行了事务3,4,又有一个用户对这张表执行了UPDATE的操作:
    第5个事务:
start transaction;
update user set name='Jucy' where id=2;
commit;

得到如下表:

uid name 创建时间() 删除时间()
1 Hans 1 4
2 Will 1 5
3 Jack 1 undefined
4 Charles 3 undefined
2 Jucy 5 undefined

继续执行事务2的(s 2),会得到如下表

uid name 创建时间() 删除时间()
1 Hans 1 4
2 Will 1 5
3 Jack 1 undefined
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容