MySQL InnoDB 的多版本并发控制(MVCC)

innoDB 的多版本并发控制(MVCC)

1. MVCC定义

1.1定义

MVCC全称Mutli Version Concurreny Control,多版本并发控制,也可称之为一致性非锁定读;它通过行的多版本控制方式来读取当前执行时间数据库中的行数据。实质上使用的是快照数据,这样就可以实现不加锁读。MVCC 主要应用于 Read CommitedRepeatable read 两个事务隔离级别。

1.2一些困惑

  • MYSQL的事务隔离级中的RC,RR级别怎么实现?
  • 事务回滚操作是怎么回滚?
  • 数据多版本并发控制中的多版本在哪里?

2.innoDB 的逻辑存储结构

innoDB 的数据保存在表空间中,表空间又包含各种段,其中有数据段,索引段,回滚段。InnoDB中数据以B+Tree的数据结构存储的,非叶子节点既是索引,叶子节点既是数据行,回滚段用于存储undoLog,undoLog中记录的就是多版本数据,用于快照读和事务失败后的数据回滚,MySQL在合适的时机会清理undoLog。


960295-20180123215304569-1124033252.png

3.MVCC的实现

MVCC的实现依赖于 每行的隐藏字段,DB_TRX_ID,DB_ROLL_PTR,删除标记位,还有read_view。

3.1 三个隐藏字段

innoDB 向数据库中存储的每行添加三个隐藏字段(有的书上说是两个,但是我看官方文档说是三个)。

数据初始化.png

1 DB_TRX_ID 事务id

占6 字节,表示这一行数据最后插入或修改的事务id。此外删除在内部也被当作一次更新,在行的特殊位置添加一个删除标记(记录头信息有一个字节存储是否删除的标记)。

2 DB_ROLL_PTR 回滚指针

占7字节,回滚指针指向被写在Rollback segment中的undoLog记录,在该行数据被更新的时候,undoLog 会记录该行修改前内容到undoLog。

3 DB_ROW_ID 行ID

占7字节,他就项自增主键一样随着插入新数据自增。如果表中不存主键 或者 唯一索引,那么数据库 就会采用DB_ROW_ID生成聚簇索引。否则DB_ROW_ID不会出现在索引中。

3.2 undo log

undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;与redo log不同的是,磁盘上不存在单独的undo log文件,所有的undo log均存放在主ibd数据文件中(表空间),即使客户端设置了每表一个数据文件也是如此。

undo log 在 Rollback segment中又被细分为 insert 和 update undo log , insert 类型的undo log 仅仅用于事务回滚,当事务一旦提交,insert undo log 就会被丢弃。update的undo log 被用于 一致性的读和事务回滚,update undo log 的清理 是在 没有事务 需要对这部分数据快照进行一致性读的时候 进行清理。

undo log 的创建
每次对数据进行更新操作时,都会copy 当前数据,保存到undo log 中。并修改 当前行的 回滚指针指向 undo log 中的 旧数据行。


undolog.png

3.3 read_view 判断数据行可见性

在innodb中,创建一个新事务的时候,innodb会将当前系统中的活跃事务列表创建一个副本(read view),副本中保存的是系统当前不应该被本事务看到的其他事务id列表。当用户在这个事务中要读取该行记录的时候,innodb会将该行当前的版本号与该read view进行比较。

具体的算法是(可重复读级别):

假设当前 数据行 事务ID 为 T0 ,read view 中保存的 最老的事务id T_min ,最新的 事务id 为 T_max,当前进行的事务id 为 T_new 。

  • 如果 T0 < T_min ,那么该行数据可见。

    因为 T0 在 T_new 事务开始前 已经提交。

  • 如果 T0 > T_max ,数据行不可见。根据DB_ROLL_PTR 指针 找到下一个 数据版本,再次进行数据可见性判断。

    因为 T0事务 在 T_new 开始前并不存在,也就是说T0 在T_new 开始后 创建。

  • 如果 T_min <= T0 <= T_max ,判断T0 是否在read_view 中,如果 不在该行数据可见。如果不可见根据DB_ROLL_PTR 指针 找到下一个 数据版本,再次进行数据可见性判断。

3.4 Read Commited ,Repeatable read 数据可见性判断

Read CommitedRepeatable read 采用相同的数据可见性判断逻辑。
那么怎么在相同的判断逻辑下 分别 实现 RC 和 RR 级别的?

  • Read Commited
    在每次语句执行的过程中,都关闭read_view, 重新创建当前的一份新的read_view。
    这样就可以根据当前的全局事务链表创建read_view的事务区间,实现read committed隔离级别。
  • Repeatable read
    在repeatable read的隔离级别下,创建事务trx结构的时候,就生成了当前的global read view。
    使用trx_assign_read_view函数创建,一直维持到事务结束,这样就实现了repeatable read隔离级别。

正是因为Read CommitedRepeatable read的read view 生成方式和时机不同,导致在不同隔离级别下,read committed 总是读最新一份快照数据,而repeatable read 读事务开始时的行数据版本。

4. 新的疑问

每行的记录头信息保存在什么位置,官方文档说是删除是逻辑的删除,删除只是记录一个删除标记。
通过查看一些博客说是被记录在记录头信息中,但是官方说的三个隐藏字段并没有提到这个记录头信息。那他到底算不算隐藏字段。如果不是隐藏字段那他记录在哪里?


1253350-20180420172417526-524213118.jpg

5 .参考文档

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