Innodb 事务详解(2)-原子性,持久性的实现

 在Innodb 事务详解(1)当中我们介绍了什么是事务,以及事务需要满住什么条件接下来我们来聊一聊inndb是如何实现事务的这些特性的。
 在聊事务实现之前我们来先补充一些基础知识。

1、WAL(预写日志)

  目前数据的持久化存储都是依靠硬盘来实现的,硬盘的内部结构是这个样子的


硬盘的结构

 它有多个盘面,每个盘面上有一圈一圈的圆形的磁道,磁道被分为多个扇形的扇区。扇区上存储着我们的数据,从扇区读写数据是通过磁头移到到指定的扇区上来操作的。读写数据时首先磁头移动到指定的磁道上,然后等待盘面旋转使得磁头正好位于我们想要操作的扇区上,这个步骤叫做寻址,然后磁头开始对扇区进行读写操作。
 磁盘的寻址需要盘面和磁头的机械运动,这个过程相对于磁头的读写数据来说是非常耗时的。这种结构决定了磁盘在随机读写的时候是相当慢的,因为需要多次寻址,而在顺序读写的时候是非常的快的,因为只需要一次寻址操作。
 这里有个机械硬盘读写性能测试,顺序读写比随机读写快了90倍。

 可是在大多数使用场景下我们都需要对数据进行随机读写的,就拿数据库来说吧,插入的时候为了读得快肯定要进行排序,排序就会发生后写入得数据排在先写入的数据前面的情况,这个时候肯定就有大量的随机写的操作。修改和读取那就更不用说了,肯定有大量的随机操作。


硬盘读写速度.jpg

 随机操作硬盘太慢了那咋办呢,那就把随机操作转换成连续操作,也就是现在大多数存储系统使用的 WAL技术,原理很简单,在内存当中保存数据的时候只在内存当中进行修改,硬盘上的数据先不动,为了防止内存当中的修改丢失,保存一条日志,日志积累到了一定大小,或者需要的时候顺序写入硬盘。内存当中的数据也不是一条一条存的而是分页来存储的,一页当中有多条数据,写入的时候就整页写,这样就把随机的硬盘操作变成了顺序操作,大大提升了效率。
整体思路有了还是有几个细节上要处理 的问题
① 为了性能考虑 ,日志里面一般不会记录真个内存页的所有的数据,只会记录增量的数据(哪些数据发生了变化)。这样问题就来了,当系统崩溃重启的时候,我们从哪个日志开始来恢复硬盘中的数据,
 为了解决这个问题,一般采用的方式是每条日志都给上一个递增的编号,在实际数据页当中也保存一个编号,这个编号和最后一次写入这个数据页的日志编号一样,这样恢复的时候用数据页上的编号和日志上的编号进行对比,就能够从正确的位置。
② 同样也是为了性能考虑,一般内存中存储的数据页要比硬盘的最小写入单元扇区大很多,也就是写入数据页写入硬盘的过程不是原子的。
为了解决这个问题,首先日志的大小需要设置成和扇区的大小一样,保证每条日志的原子性(512字节),一次的变更可以使用多条日志来表示。
在就是内存当中的数据页刷入硬盘的时候 采用双写,每次刷多个数据页的时候 先把这些数据页进行顺序写入一个缓冲区,这个过程是顺序写操作,再把数据页写入实际存储的位置后上去,当页面刷入硬盘失败的时候就可以直接从缓冲区恢复。

原子性的实现

 那innodb原子性实现是不是只记录一个日志就行了呢,理论上貌似是可以是实现的,每次操作的时候记录一条日志,需要回滚的时候读取到相应的操作执行相反的操作就行了,可是这样做的性能不高,操作日志即数据库中的redo log是整个库通用的一个,线上的数据库通常一般操作会非常多,这就导致redo log数据量会非常的大,回滚操作的时候去读取数据量这么大的redo log会非常的耗时,而且redo log 记录的是物理日志,记录的是某个内存页发生了什么变化,而回滚是根据操作逻辑来的,是redolog 来记录回滚信息显然是不合适的。 于是在inndb当中专门为回滚设计了一个日志叫做 undo log,这个日志记录的是逻辑日志,当操作修改和新增,删除的时候相当于记录了一个相反的操作,为了提升性能,undo log是按照事务id来存储的,相同事务id的日志存储在相同的槽当中,这样回滚的时候能够快速找到日志,当事务提交的时候也能够快速清理调日志内容。
 undo log的特性决定了它会涉及到大量的随机读写操作,直接操作硬盘显然不合适,那么如何保证undo log的持久性呢,不能说故障重启之后undo log就丢了,那没提交的数据咋回滚。
 于是innodb给undo log 数据页的操作也添加了redo log 写undo log 之前先顺序写入redo log ,故障恢复时 先通过redo log 恢复undo log 在通过undo log来确定是否需要回滚。
&emps undo log redo log 的存在就确保了inndb的原子性,在事务当中的存在执行的时候 先写undo log (先写入 undo log 数据页的redo log 再 修改undo log内存页),在写实际数据(先写实际数据页的redo log的,在操作内存数据)当事务提交的时候,把redo log全部刷入硬盘就行了。需要回滚的时候根据事务id读取到undo log 根据 undo log 来进行回滚操作 。

持久性的实现

 通过 WAL技术(redo log)即实现了持久性,每次操作之前写记录 redo log 事务提交的时候把日志刷入硬盘 实现了持久性。

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

推荐阅读更多精彩内容