mysql-MVCC

简介:

mvcc 全称 multiple version concurrency control 多版本并发控制,是数据库领域比较常用的一种非锁并发技术。

mysql 的innodb中,在RR、RC级别会使用mvcc来提升并发。


原理:

首先理解几个基本知识点。

  1. mysql在行都设置了默认列(对查询不可见),包含有 data_trx_id、data_roll_ptr、db_row_id、delete bit

    • db_row_id 用户没设置主键,系统自动生成主键。

    • delete bit 删除标志

    • data_trx_id 最近更新或创建 这条记录的 事务id

    • data_roll_ptr 回滚指针(也称之为删除事务id,在事务中查找查找上个版本的记录就靠这个指针,指向了undo log的地址,可以把同一个事务中的多个版本理解为链式关系)

  2. Read View:RR、RC级别,开启事务时,每个事务各自都会维护一份Read View,ReadView 中包含了当前DBMS中活跃的事务id列表(即begin开启了,但未commit的事务),后续简称RV。

  3. 事务select的检索的规则:

    • 查找比当前事务id小的trx_id,这样能够保证查询出当前事务开启前已经写入或提交的数据。

    • 查找行删除事务Id未设置或者删除事务Id值大于当前事务Id,这样能保证,当前事务开启后被删除的数据对当前事务是可见的。

    • 匹配Read View 列表(因为前两条并能不保证mvcc的正确性,见下文举例)

      • 比较RV中max(trx_id) 和 min(trx_id)

        • 如果current_trx_id < min(trx_id) 说明要访问的版本早已经提交,对当前事务来说数据都是可见的

        • 如果min<current_trx_id<max 说明当前事务可能正处于活动事务列表中,查找列表如果事务还存在,那么版本不可见从该行的roll_ptr指向的行获取值,如果不在列表说明事务已经提交了,数据可见。*

        • 如果current_trx_id >max 说明当前事务是在RV副本生成之后产生的,更新的数据应该不可见,从该行的roll_ptr指向的行获取值。*

看下具体过程:

当事务级别为默认级别RR时:

假设 有表 test

create table test(
  bl varchar(20),
  id not null primary key
);

有事务 A、B、C、D 分两个场景来看 RV的关系。

  • 场景1:

RR级别时候,RV不会更新,一直保持开启事务时候生产的RV,RV=[1]当前数据不可用,需要查询历史版本,发现roll_ptr为空,无历史版本,古返回为空。

RC级别时候,每次查询RV会生成新的列表,最终RV为空,故直接返回行数据即可。

场景1:
transaction A transaction B output 解释:
begin; A开启事务,trx_id=1,RV=[]
insert into test(bl,id) values(1,1);
begin; B开启事务,trx_id=2,RV=[1]
select * from test; 规则1:查询trx_id<=2,得到A插入的数据 规则2:查询RV,current_trx_id>max(trx_id),数据是不可见的。 最终返回值为 空
select * from test; 1,1
commit;
select* from test; RR级别:RV=[1] ,从roll_ptr获取值,roll_ptr此时为空,查询结果仍然是空 RC级别时:RV=[],查询结果是 (1,1)
  • 场景2

表初始数据是 "小明"

RR级别时也是一样,会一直持有同一张RV,RV=[1,2] ,会认为1,2 版本均不可用户,会寻找1,2版本的历史版本,返回值是 小明

RC级别的时候,RV会一直更新,RV=[2]会查找2的历史版本 trx_id=1的提交记录,小明1,以此类推。

场景2:除了mvcc mysql 还是用了X锁
tx A trx_id=1 tx B trx_id =2 tx C trx_id=4 tx D trx_id =3 RR- output: RC-output
begin;
update test set bl='小明1' where id =1
begin;
update test set bl='小明2' where id=1
select * from test; 小明 RV=[1,2] 小明 RV=[1,2]
commit;
select * from test; 小明 RV=[1,2] 小明1 RV=[2]
begin; update test set bl='小明3' where id=1
select * from test; 小明 RV=[1,2] 小明1 RV=[2,4]
commit;
select * from test; 小明 RV=[1,2] 小明2 RV=[4]
commit;
select * from test; 小明 RV=[1,2] 小明3 RV=[]

能看出来 mysql innoDB实现的并不是纯粹的MVCC 模式,其中还加入了X锁。严格来讲应该是 “X锁+MVCC”来达到MVCC的目的。

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

推荐阅读更多精彩内容

  • MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read...
    尹楷楷阅读 1,090评论 0 5
  • 前言 最近在学MySQL,决定记录一下,能写多少写多少,不定时更新,加油。 正文 分几个部分来吧,大致如下: 字符...
    sunyelw阅读 1,101评论 0 0
  • 1.Mysql特点 可靠、事务、开源。 2.MySQL架构 接入层,连接通信、权限验证、连接池、线程管理 服务层,...
    不是明天阅读 4,449评论 1 0
  • 一、阐述 mvcc(multi version concurrency control)多版本并发控制,其作用就是...
    小马蛋阅读 457评论 0 2
  • MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。MVCC 是一...
    yes的练级攻略阅读 1,661评论 2 2