数据库事务的前世今生 - 速度和可用的博弈

在上文《https://www.jianshu.com/p/5f07652cb4fb》中,我们讲解了数据库的事务及事务的特性ACID,了解到一个数据库要支持事务,就需要实现完备的事务的规范,我们才能说这是一个支持事务的数据库,例如Mysql、Oracle等。
本文就来讨论一下数据库实现事务的几个关键阶段,背后都经历了哪些曲折的技术变迁。

数据库的事务,本质上是解决数据库并发的问题,处理多个数据操作时相互不干扰,都能得到正确的执行结果,这个问题在应用层是无法解决的,因为你完全不知道同时可能有另一个程序(进程)也在操作相同的数据项,所以,这个问题必须由数据库来解决。

完全顺序执行

最简单的思路,就是完全顺序执行所有的数据库操作,不需要加锁,简单的说就是全局排队,序列化进行所有的事务单元,数据库同时只处理一个事务,特点是强一致性,处理性能低。
这种模式适应于早期的C/S开发模式,单机系统,一个系统,一个数据库(例如Access数据库),完全本地用户+本地系统+本地事务。


并行+排他锁

开始支持并行处理事务,如果事务之间涉及到相同的数据项时,会使用排他锁,或叫互斥锁,先进入的事务独占数据项以后,其他事务被阻塞,等待前面的事务释放锁。


注意,在整个事务1结束之前,锁是不会被释放的,所以,事务2必须等到事务1结束之后开始。

并行+读写锁

采用了 并行+排他锁 以后,大幅提升了数据库事务处理效率,如果几个事务之间没有共享数据项,完全可以并行被处理,但,一些数据库大牛们显然对这个性能还不满足,进一步研究细化发现,所有的事务当中,对数据的操作无非是读和写排列组合的几种结果, 读读、写写、读写、写读 这4种情况的不断重复。

哪些操作之间可以相互兼容,或者共享呢?例如,读的时候为什么要阻止读呢?

所以,读写锁就应用而生了,进一步细化锁的颗粒度,区分读和写,让读和读之间不加锁,这样下面的俩个事务就可以同时被执行了。


读写锁,可以让读和读并行,而读和写、写和读、写和写这几种之间还是要加排他锁。

MVCC

有人可能要说,优化到这个份上,已经差不多了吧,还有空间?
大牛们用行动告诉世人,答案是肯定的。
往往,确定一个模型不是最难的,难的是对这个模型实现的境界,大牛们会把自己的实现往死里优化,并行+读写锁 解决了读和读的并行,大牛们接下来要解决的是写和读、读和写,甚至写和写是否都可以并行!

这个技术就是现在大部分数据库在使用的事务处理技术,MVCC(Multi Version Concurrency Control),也就是Copy on Write的思想,对数据项进行多版本控制,一个精妙的想法,用空间换时间,进一步优化锁,减少锁。

MVCC

给每条记录增加版本号和删除俩个字段,在事务开始的时候copy一个新的版本,此时事务操作的实际上是一个副本,因此不会影响其他事务对此数据项的读操作,选择版本号最大的记录读取。

MVCC的好处,

  1. 除了支持读和读并行意外,可用让读和写并行、写和读并行,但,为了保证一致性,写和写是无法并行的
  2. 大事务支持较好,之前的所有方案,因为锁的普遍存在,如果一个事务执行的时间太长,意味着后面的事务要长期等待,甚至超时,所以在之前,数据库一直建议不要维持大的数据库事务。

另外,MVCC支持读已提交 和 重复读俩种隔离级别,串行和读未提交都没有意义,一个必须要求排队执行,另一个要求必须读取最新数据。

小结

人类对速度的激情是没有最快,只有更快。
所以,以上方案的演变,本质是速度上的逐步提升的过程,到目前MVCC为止,在数据库层面能做的事情已经不多了。

进一步,如何解决写和写冲突的问题,这里提供俩个思路

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

推荐阅读更多精彩内容

  • 前言 只有光头才能变强 索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的。 本文力求简单讲...
    Java3y阅读 3,509评论 6 109
  • 一、什么是事务? 数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成...
    join_a922阅读 428评论 0 0
  • 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并...
    CodeKing2017阅读 610评论 0 7
  • 什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。 原子性:要不全部成功,要不全部撤销 隔...
    jiangmo阅读 1,082评论 0 3
  • 杜宸馨 我是从三岁开始读书的,三岁时最喜欢读的书...
    慧_3a7d阅读 404评论 0 0