鸣神の 少しとよみて さし昙り 雨も降らんか 君を留めん 收藏本站
登陆 / 注册 搜索

阅读:7.9K   回复: 2

狂拽炫酷的数据库老爷子

[复制链接]
仗剑天涯论坛大牛 2017-11-7 18:38 |显示全部楼层

今生相逢便是缘分,何苦去怨恨,何苦去仇视。

主题破百 赞助会员 金点子奖
        我们这个世界很大, 生活着很多人,形形色色,各怀绝技。但是被公认为最拽的一个却是数据库老爷子。

        老爷子有他拽的资本,因为我们这个系统的核心数据都是在老爷子那里存放着, 例如用户了,订单了,交易了......    我向别人打听过, 这些数据已经在老爷子那里积累了20多年了, 最早的时候是Dephi, PowerBuider 这些上古的软件写的系统访问, 后来慢慢转到互联网,先用PHP访问, 再后来变为Java。
狂拽炫酷的数据库老爷子 faster-rails-indexing-large-database-tables-without-downtime-aa60f3c4.png


👂🛑🌰♊🕊‎

        看来最宝贵的东西是数据, 外界系统可以变, 但是数据不能丢, 老爷子守着这份财产,生生地熬死了一代人,估计还会再熬死一代人。

一、事 务

        
        这一天老爷子又在那里一边喝酒,一边“吹嘘” 他的事务管理,说些ACID之类我们都听不懂的外国话, 和数据库经常打交道的是年轻的小伙子Tomcat,   对于老爷子,他比我们多了解那么一点点。
🦴🚂🍭💲🦄‎
        Tomcat端了一杯啤酒来到老爷子桌前:“嗨,老爷子,我知道你说的事务有个重要的特性:原子性,就是说在一个事务中不管有多少操作,都是要么全做,要么全不做,是这样吧!”  #380:

        “那是自然!”
‌🎒💿😀🧠
        “我很好奇,在执行的操作过程中,如果还没做完系统就崩溃了,或者断电了,你怎么办啊? 你怎么保证原子性?”

        听到Tomcat问了一个关键的问题,酒馆里的CPU阿甘, Ngnix, Spring, MyBatis 都围了过来,都想听听老爷子的高见 。

        “如果我还没做完,系统就崩溃了,那系统重启以后我就得做恢复操作啊。”👨‍🎨‏🩴🪣🤬👆

        “怎么恢复啊? ”  Tomcat 穷追不舍。

        “你举个例子,我给你分析分析 ” 老头环顾四周,看到人们都围了上来,也来了一点兴致 , “光讲理论,这些小朋友们怎么听得懂?”

🙏🌦🍚♀🐠‍

        “好啊, 比如旺财有200块钱, 小强有50 块钱,现在旺财要给小强转账,假设转100块吧, 你说说,你是怎么实现要么不做,要么全做的。 ”  

        (1)  开始事务 T1 (假设T1是个事务的内部编号)
        (2)  旺财余额 = 旺财余额 -100
        (3)  小强余额 = 小强余额 + 100👨‍🚒‎🧢🧬😅🧠
        (4)  提交事务 T1


        CPU阿甘插了一嘴说: “虽然这些都是我在做计算,但是这些计算结果都是先存在内存中的, 内存那家伙一断电啥都忘了, 如果第三步还没执行完就断电了, 那不就完蛋了。”

        数据库老爷子说: “虽然数据先在内存中被计算出来, 但是我是要写入硬盘的数据库文件的,知道不? ”
🤙🌦🌶🆗🦌‌
狂拽炫酷的数据库老爷子 1-写入数据库.png


        “你的数据缓冲区是啥意思?”    人群里有人问道。

👏🚈🍒➡‎        “老土! 连数据缓冲区都不知道! 我告诉你吧, 那个硬盘啊速度太慢了,比内存慢个几万倍,你说我能每次操作都去写硬盘吗? 绝对不可能,所以CPU阿甘计算出的数据我会放到数据缓冲区里, 我会在合适的时候把数据缓冲区的内容写入硬盘的数据文件。 ”

        “什么合适的时候?”

        “那是我的缓冲管理器要做的事情了,想听吗? 我再花两天给你讲讲!”🥷‌🪖⚔😴👀

二、Undo 日 志


        “算了算了, 我们还是先假定数据缓冲区能和硬盘的数据文件同步吧, 回到刚才的问题,旺财在给小强转账, 第二步执行完了,旺财的余额变成了100块 (200-100), 假设已经写入了硬盘文件, 现在断电了, 小强的余额有没有加上,系统的钱白白消失了100块, 数据已经不一致了,  你怎么办?”    Tomcat把话题转移回来。

🤙🪐🍪🈴🐺‏        “放心吧, 我会记录日志的,我有个叫做Undo的日志文件,就是为了解决这个问题的”   老爷子喝了一口酒 ,准备开始放大招  “比如你说的情况, 我会在我的日志文件中记录下事务开始之前的他俩账号余额:

       [事务T1,  旺财原有余额 , 200]
        [事务T1, 小强原有余额, 50 ]

👨‍🎨‌🩲🔒😋🤝
        如果事务执行到一半,就断电了,那数据库重启以后我就根据undo的日志文件来恢复。”

        “嗯,那要是系统恢复的过程中又断电了,还得再次恢复,那数据岂不变得一团糟? ”  CPU阿甘对断电心有余悸。

        “对啊对啊”, 周边的人附和到。
👍🏠🥑💲🐢‏
        “你们这些年轻人啊, 还是too simple,  你们仔细想想,即使我把旺财的余额和小强的余额恢复了100次,会有什么结果?”#392:

        “如果每次都试图把旺财的余额设为200, 小强余额设为50, 做多少次都没问题, 因为他俩原来的余额就是那么多 !”  Tomcat恍然大悟。

🙏🏝🍞❎🦌‎        “这就叫做操作的幂等性,知道不? 我可以一直做恢复,恢复过程中断电也不怕,只要把恢复做完就行。” 老爷子看到时机一到,立刻上升为理论。

        “恢复数据的时候, 那你怎么才能知道一个事务没有完成呢?” Tomcat接着问道。

        数据库老爷子对这个问题似乎很满意,  专门花点时间写了几行字:🧑‍🍳‎👞🪟😛👂

        [开始事务 T1]
        [事务T1, 旺财原有余额,200]
        [事务T1, 小强原有余额,50]
        [提交事务 T1]

✊🚂🍧🈸🐅‍
        “Undo日志文件中不仅仅只有余额, 事务的开始和结束也会记录,如果我在日志文件中看到了[提交事务 T1], 或者 [回滚事务 T1], 我就知道这个事务已经结束,不用再去理会它了, 更不用去恢复。 如果我只看到 [开始事务 T1], 而找不到提交或回滚,那我就得恢复。比如下面这个:”

        [开始事务 T1]
        [事务T1, 旺财原有余额,200]🧑‍🎤‌🧢🪜😶💅
        [事务T1, 小强原有余额,50]


        “特别是,” 老头补充道, “ 我恢复以后, 需要在日志文件中加上一行 [回滚事务 T1] , 这样下一次恢复我就不用再考虑T1这个事务了。”

三、独 门 绝 技

👏💈🍖❌🐻‌
        “不对吧, 你这个Undo日志文件会面临和数据文件一样的问题, 都是需要加载到内存才能读写, 要不然会太慢。  那要是连日志文件还没写好就断电了,那不还是玩完?” Ngnix 目光如炬,向深层次挖掘。

        这是个绝佳的问题,大家纷纷把目光杀向数据库老爷子,希望这一次能把他打翻在地。
👩‍🎩🔍🤔✋
        老爷子镇定自若,没有回答,反而给大家抛出一个问题:“你们想想,我什么时候应该记录Undo日志,什么时候把Undo日志写入文件呢?”

        “事务一开始的时候就得把Undo日志写入文件, 这样最安全!”  

        老爷子笑了笑说: “蠢材! 一开始的时候我都不知道程序到底要操作那个字段,怎么记录Undo日志,怎么写入硬盘文件? ”

👄🪐🍟❎🐢‍


        “那怎么办啊? ”

        “这就是我的独门秘籍了, 我给大家举个例子, 你们可要看仔细了, 我把日志记录也放到了内存的Undo日志缓冲区,伺机写入硬盘。”
🧑‍🍳‎🩳🪜😔👀
狂拽炫酷的数据库老爷子 2-Undo日志.jpg


        “不知道你们这些小朋友看出一点门道儿没有?” 老爷子问道。

        “让我想想” Ngnix说, “如果系统在第4步和第5步之间崩溃,旺财的余额写入了硬盘,但是小强的还没写入, 那Undo日志看起来是这样的:
🤳🎢🍚☣🐕‏
        [开始事务 T1]
        [事务T1, 旺财原有余额,200]

        由于找不到事务结束的日志, 你会进行恢复操作, 把旺财的原有余额给恢复了。 ”

🧒‏🧢📬🙃🙏



        Tomcat 接过来说:“如果是在第7步和第8步之间系统崩溃,旺财和小强的最新余额都写入了硬盘,但是没有提交事务, 那Undo日志看起来是这样的:
        
        [开始事务 T1]
        [事务T1, 旺财原有余额,200]

👨🦱‌🎒📐😃👃


        [事务T1, 小强原有余额,50]


        由于没有事务结束的日志,你也需要进行恢复,把旺财和小强的原有余额恢复成200和50 ”

        CPU阿甘也不甘示弱说: “如果是在第8步和第9步之间系统崩溃, 旺财和小强的最新余额都写入了硬盘, 也提交了事务, 但是提交事务的操作没有写入Undo 日志, 所以Undo日志还是这样:”

🤙⛪🍖♑🐢‌


        [开始事务 T1]
        [事务T1, 旺财原有余额,200]
        [事务T1, 小强原有余额,50]

🧑‍🍳‍👠🪗😒👄
        由于没有事务结束的日志,你还得需要进行恢复,把旺财和小强的原有余额恢复成200和50”

        数据库老头笑眯眯的听着大家的分析,似乎非常的享受: “是不是可以应付各种情况啊? 啊?”

        大家纷纷点头,佩服无比。

🖕🎠🍏💲🦜‌


        Tomcat都不叫老爷子,改称为老先生了: “ 老先生,  好像是有什么内在的规律,您给说说!”

        数据库老爷子无比得意, 兴致勃勃地说, “这就是我的独门秘籍了, 其实很简单了, 就两条:

🤳🏠🎂🈷🪰‌        1.  在你把最新余额写入硬盘之前, 一定要先把相关的Undo日志记录写入硬盘。 例如: [事务T1, 旺财原有余额,200] 一定要在旺财的新余额=100写入硬盘之前写入。

        2.  [提交事务 T1] 这样的Undo日志记录一定要在所有的新余额写入硬盘之后再写入。  有了这两条的保证,我就可以高枕无忧了!, 比如说,换个操作次序也没有问题:”

狂拽炫酷的数据库老爷子 3-Undo日志.jpg

🙌🌧🍒🅰🐅‍
        大家仔细一想,果真如此啊,看来数据库老爷子, 不,数据库老先生经常自夸还真有道理,人家真的有干货啊。

本文来自微信公众号:码农翻身(有修改)
作者:老刘
上一篇
下一篇
帖子热度 7896 ℃

站在记忆的边缘 「出类拔萃」 2018-1-20 22:41 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

远古时期并无人类,女娲娘娘补天后,用剩下的两块神泥各捏了一个小人,两人一开始并无区别,都是一头四肢,一身一乳,唤名男,女。
只是后来两人不知为何大打出手,女人强悍,把男人的那一乳撕下,据为己有置于胸前,男人几次想抢回,均未成功,于是告到女娲娘娘那里,娘娘见女人这样甚是好看,便没有给她取下,而是在女人两腿之间,不起眼处取泥一小块,搓成圆形送给男人,用以安抚。男人甚喜,如获至宝藏于身下。每每拿出把玩,均感身心愉悦,所以到了今日男人还乐此不疲。👴‌🎒✏🙃🙏
女人无时不想把它夺回,所以伤口至今没有愈合,每月均由血流出,但碍于女娲娘娘,不敢造次。多年后想出一法,找男人商量,允许男人抚摸他以前失去的那一乳(男人在抚摸时,实际上比较偏爱一个,因为那个以前就是他的),条件是也要把她原来的东西暂时放回原处,想用体液将其融化,已达到索回的目的,男人不知是计欣然同意,于是交合后两人均感到极大满足。
有了第一次,就有第二次,第三次,每次后都有一小部分被留在女人体内,但多年已过,那已被男人彻底融合,留在体内的自己却融合不了了,经十月孕育还是融合不了,但成了独立的一个生命体,不得不排出。就这样人类开始繁衍生息。。。。。
。。。我是来混熟脸的#y398:#y398:
锁上的光 「出类拔萃」 2018-1-21 06:57 |显示全部楼层

这个用户很懒,还没有填写自我介绍呢~

大师的话真如“大音希声扫阴翳”,犹如“拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳、醍醐灌顶或许不足以形容大师文章的万一;巫山行云、长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾、龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔、写天下文章的智慧神态;仿佛看见了你按剑四顾、指点江山的英武气概!
您需要登录后才可以回帖 登录 | 免费注册  

本版积分规则

快速回复 返回列表