MySQL应用技术3 — MVCC

MySQL应用技术1 — MySQL架构简介
MySQL应用技术2 — 事务简介
MySQL应用技术4 — 数据类型选择
MySQL应用技术5 — 约束与范式
MySQL应用技术6 — 数据库中的锁
MySQL应用技术7 — 性能优化简析


简单说下,前几章将大部分都是概念介绍,其实我也在想,如何才能将自己掌握的东西表达出来,而又保障知识点的准确性,前两章采用了【斜体】的方式表明了哪些是自己的见解。但是总体看下来,个人见解部分还是太过少了。本章开始将不再局限于当前题目的知识点,可能会涉及到更多的内容,不过可能有的东西就没有太过考证,如有疏漏,还望大家不吝赐教


在前一章讲到了数据库的事务,然而在大多数支持事务的MySQL引擎的实现并不是简单的行级锁。基于提升并发性能的考虑。他们一般都实现了多版本并发控制(MVCC)。其实包括Oracle,PostgreSQL在内的数据库均实现了MVCC,但各自的实现集中都不尽相同,因为MVCC并没有一个统一的实现标准。

其实MVCC可以认为是行级锁的一个变种,它在大多数情况下避免了加锁操作,因此竞争开销更低。大部分MVCC的实现机制都做到了非阻塞的读操作,写操作也只锁定必要的行
【InnoDB中写操作只锁定必要的行其实是有歧义的,或者说对“必要的行”可能没有大家想象的这么美好。因为当使用Update语句时,所锁定的行其实还是要看where条件是否命中索引,如果update语句命中了索引,那么ok只会锁受影响的行。否则将是整个表的写锁(tip1:不过读操作并不会收到影响,毕竟是非阻塞的读操作。tip2:新版本的MySQL中在将数据从存储引擎中取到MySQL服务器后,过滤出要更新的行之后,那么将释放那些没有收到影响行的锁。并不会等到事务结束后再进行释放(tip2.1 其实这里就违反了两段锁协议))】

InnoDB中的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期或删除时间。当然存储的并不是时间的时间,而是系统版本号(system version number)。每开启一个新的事务,系统的版本号都会自动递增。事务以当前版本号为基准进行比较。下面来看下在可重复读的隔离级别下,MVCC是具体是如何操作的。

SELECT

InnoDB 会根据两个条件来检查每行记录:

  • InnoDB只查找版本(DB_TRX_ID)早于当前事务版本的数据行(行的系统版本号<=事务的系统版本号,这样可以确保数据行要么是在开始之前已经存在了,要么是事务自身插入或修改过的)
  • 行的删除版本号(DB_ROLL_PTR)要么未定义(未更新过),要么大于当前事务版本号(在当前事务开始之后更新的)。这样可以确保事务读取到的行,在事务开始之前未被删除。
INSERT

InnoDB为新插入的每一行保存当前系统版本号作为行版本号

DELETE

InnoDB为删除的每一行保存当前的系统版本号作为行删除标识

UPDATE

InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识

【其实这里无论update操作还是delete操作,都是做了删除标识操作,可能大家就在想,那我不断的update,岂不是会有很多旧的记录,这么多会不会浪费存储空间,我个人理解的是会在一定时间后物理删除那些被标记为删除的行。然后此时的MVCC机制则通过 undoLog来实现。至于undoLog ,我发现了一篇比较好的文章,大家想要了解的可以去读下: 一文了解InnoDB事务实现原理 中的第二部分 undoLog】

通过保存这两个额外系统版本号,使大多数读操作都可以不用加锁【不知道为啥是大多数,书上这么想的,我也没想到那种还得加锁,除了显示声明加锁】。这样设计是的数据库读操作变得很简单,性能很好,也能保证只会读取到符合标准的行。不足之处是每行记录都需要额外的存储空间,需要做更多的行检查工作,以及额外的维护工作。

对于上一章说道的四个隔离级别,只有读已提交,和可重复读是由MVCC机制实现的。读未提交则是每次都读最新的行数据,串行化则是对所有读取的行也都会加锁。(MySQL应用技术2 — 事务简介

文中【斜体】部分多为个人理解,不足支持还望指正。

欢迎注明出处及本文链接的转载。

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

推荐阅读更多精彩内容

  • 一、事务 1、事务四要素:ACID 对于事务,我之前的理解是很粗糙的,不就是为了保证操作的原子性么?一般订单系统或...
    张伟科阅读 1,304评论 0 5
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 2,918评论 0 8
  • 前言:我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是...
    bbe9e62bc5ba阅读 745评论 0 2
  • MySQL 加锁处理分析 12月 13th, 2013 发表评论 | Trackback 1 背景 1 1.1 M...
    10xjzheng阅读 4,597评论 3 7
  • 为了充分发挥MySQL的性能并顺利地使用,就必须理解其设计。MySQL的灵活性体现在很多方面。例如,你可以通过配置...
    李文文丶阅读 1,174评论 0 4