成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

愛炫耀的數據庫老頭兒

數據庫
我們這個世界很大, 生活著很多人,形形色色,各懷絕技。但是被公認為最拽的一個卻是數據庫老頭兒,年齡挺大,每天都要炫耀幾遍他那關系型數據庫, 那理論有著多么堅實的數學基礎,那關系運算是多么地優雅,事務管理是多么強大,還有他是多么地穩定, 要不怎么他怎么能活這么久等等。

[[208999]]

1.數據庫老頭兒

我們這個世界很大, 生活著很多人,形形色色,各懷絕技。但是被公認為最拽的一個卻是數據庫老頭兒,年齡挺大,每天都要炫耀幾遍他那關系型數據庫, 那理論有著多么堅實的數學基礎,那關系運算是多么地優雅,事務管理是多么強大,還有他是多么地穩定, 要不怎么他怎么能活這么久等等。

老頭兒有他拽的資本,因為我們這個系統的核心數據都是在老頭兒那里存放著, 例如用戶了,訂單了,交易了...... 我向別人打聽過, 這些數據已經在老頭兒那里積累了20多年了, 最早的時候是Dephi, PowerBuider 這些上古的軟件寫的系統訪問, 后來慢慢轉到互聯網,先用PHP訪問, 再后來變為Java。

看來最寶貴的東西是數據, 外界系統可以變, 但是數據不能丟, 老頭兒守著這份財產,生生地熬死了一代人,估計還會再熬死一代人。

2.事務

這一天老頭兒又在那里一邊喝酒,一邊“吹噓” 他的事務管理,說些ACID之類我們都聽不懂的外國話, 和數據庫經常打交道的是年輕的小伙子Tomcat, 對于老頭兒,他比我們多了解那么一點點。

Tomcat端了一杯啤酒來到老頭兒桌前:“嗨,老頭兒,我知道你說的事務有個重要的特性:原子性,就是說在一個事務中不管有多少操作,都是要么全做,要么全不做,是這樣吧!”

“那是自然!”

“我很好奇,在執行的操作過程中,如果還沒做完系統就崩潰了,或者斷電了,你怎么辦啊? 你怎么保證原子性?”

聽到Tomcat問了一個關鍵的問題,酒館里的CPU阿甘, Ngnix, Spring, MyBatis 都圍了過來,都想聽聽老頭兒的高見 。

“如果我還沒做完,系統就崩潰了,那系統重啟以后我就得做恢復操作啊。”

“怎么恢復啊? ” Tomcat 窮追不舍。

“你舉個例子,我給你分析分析 ” 老頭環顧四周,看到人們都圍了上來,也來了一點興致 , “光講理論,這些小朋友們怎么聽得懂?”

“好啊, 比如旺財有200塊錢, 小強有50 塊錢,現在旺財要給小強轉賬,假設轉100塊吧, 你說說,你是怎么實現要么不做,要么全做的。 ”

(1) 開始事務 T1 (假設T1是個事務的內部編號)

(2) 旺財余額 = 旺財余額 -100

(3) 小強余額 = 小強余額 + 100

(4) 提交事務 T1

CPU阿甘插了一嘴說: “雖然這些都是我在做計算,但是這些計算結果都是先存在內存中的, 內存那家伙一斷電啥都忘了, 如果第三步還沒執行完就斷電了, 那不就完蛋了。”

數據庫老頭兒說: “雖然數據先在內存中被計算出來, 但是我是要寫入硬盤的數據庫文件的,知道不? ”

“你的數據緩沖區是啥意思?” 人群里有人問道。

“老土! 連數據緩沖區都不知道! 我告訴你吧, 那個硬盤啊速度太慢了,比內存慢個幾萬倍,你說我能每次操作都去寫硬盤嗎? 絕對不可能,所以CPU阿甘計算出的數據我會放到數據緩沖區里, 我會在合適的時候把數據緩沖區的內容寫入硬盤的數據文件。 ”

“什么合適的時候?”

“那是我的緩沖管理器要做的事情了,想聽嗎? 我再花兩天給你講講!”

3.Undo 日志

“算了算了, 我們還是先假定數據緩沖區能和硬盤的數據文件同步吧, 回到剛才的問題,旺財在給小強轉賬, 第二步執行完了,旺財的余額變成了100塊 (200-100), 假設已經寫入了硬盤文件, 現在斷電了, 小強的余額有沒有加上,系統的錢白白消失了100塊, 數據已經不一致了, 你怎么辦?” Tomcat把話題轉移回來。

“放心吧, 我會記錄日志的,我有個叫做Undo的日志文件,就是為了解決這個問題的” 老頭兒喝了一口酒 ,準備開始放大招 “比如你說的情況, 我會在我的日志文件中記錄下事務開始之前的他倆賬號余額:

[事務T1, 旺財原有余額 , 200]

[事務T1, 小強原有余額, 50 ]

如果事務執行到一半,就斷電了,那數據庫重啟以后我就根據undo的日志文件來恢復。”

“嗯,那要是系統恢復的過程中又斷電了,還得再次恢復,那數據豈不變得一團糟? ” CPU阿甘對斷電心有余悸。

“對啊對啊”, 周邊的人附和到。

“你們這些年輕人啊, 還是too simple, 你們仔細想想,即使我把旺財的余額和小強的余額恢復了100次,會有什么結果?”

“如果每次都試圖把旺財的余額設為200, 小強余額設為50, 做多少次都沒問題, 因為他倆原來的余額就是那么多 !” Tomcat恍然大悟。

“這就叫做操作的冪等性,知道不? 我可以一直做恢復,恢復過程中斷電也不怕,只要把恢復做完就行。” 老頭兒看到時機一到,立刻上升為理論。

“恢復數據的時候, 那你怎么才能知道一個事務沒有完成呢?” Tomcat接著問道。

數據庫老頭兒對這個問題似乎很滿意, 專門花點時間寫了幾行字:

[開始事務 T1]

[事務T1, 旺財原有余額,200]

[事務T1, 小強原有余額,50]

[提交事務 T1]

“Undo日志文件中不僅僅只有余額, 事務的開始和結束也會記錄,如果我在日志文件中看到了[提交事務 T1], 或者 [回滾事務 T1], 我就知道這個事務已經結束,不用再去理會它了, 更不用去恢復。 如果我只看到 [開始事務 T1], 而找不到提交或回滾,那我就得恢復。比如下面這個:”

[開始事務 T1]

[事務T1, 旺財原有余額,200]

[事務T1, 小強原有余額,50]

“特別是,” 老頭補充道, “ 我恢復以后, 需要在日志文件中加上一行 [回滾事務 T1] , 這樣下一次恢復我就不用再考慮T1這個事務了。”

4獨門絕技

“不對吧, 你這個Undo日志文件會面臨和數據文件一樣的問題, 都是需要加載到內存才能讀寫, 要不然會太慢。 那要是連日志文件還沒寫好就斷電了,那不還是玩完?” Ngnix 目光如炬,向深層次挖掘。

這是個絕佳的問題,大家紛紛把目光殺向數據庫老頭兒,希望這一次能把他打翻在地。

老頭兒鎮定自若,沒有回答,反而給大家拋出一個問題:“你們想想,我什么時候應該記錄Undo日志,什么時候把Undo日志寫入文件呢?”

“事務一開始的時候就得把Undo日志寫入文件, 這樣最安全!”

老頭兒笑了笑說: “蠢材! 一開始的時候我都不知道程序到底要操作那個字段,怎么記錄Undo日志,怎么寫入硬盤文件? ”

“那怎么辦啊? ”

“這就是我的獨門秘籍了, 我給大家舉個例子, 你們可要看仔細了, 我把日志記錄也放到了內存的Undo日志緩沖區,伺機寫入硬盤。”

“不知道你們這些小朋友看出一點門道兒沒有?” 老頭兒問道。

“讓我想想” 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日志記錄一定要在所有的新余額寫入硬盤之后再寫入。 有了這兩條的保證,我就可以高枕無憂了!, 比如說,換個操作次序也沒有問題:”

 【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-11-28 10:09:08

語言JavaGo

2017-11-28 16:31:32

硬盤PythonJava

2019-12-30 12:15:53

戴爾

2018-12-29 14:12:33

FTPRMIXML-RPC

2018-11-12 12:50:30

C語言編程匯編

2019-10-24 08:56:38

語言代碼Java

2012-08-30 09:11:20

2009-09-17 11:13:46

數據庫機OracleSun

2017-09-27 15:13:22

Hello.javahello.c硬盤

2011-05-13 09:42:21

2009-05-08 09:56:37

MaxDBMySQL數據庫管理

2011-05-13 13:54:02

數據庫文檔數據庫

2011-05-13 13:38:49

數據庫對象

2010-04-22 16:16:35

Oracle數據庫

2011-08-10 15:46:29

數據庫

2011-03-08 08:49:55

MySQL優化單機

2021-09-09 09:28:08

面向列數據庫面向行

2015-01-05 20:43:56

2013-10-08 09:54:41

數據庫安全數據庫管理

2022-04-25 14:41:15

甲骨文數據庫機數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美国产日韩在线观看 | 亚洲人成人一区二区在线观看 | aⅴ色国产 欧美 | 欧美成人猛片aaaaaaa | 一区二区在线不卡 | 国产精品一区二区三区四区 | 中文字幕一区二区三区不卡在线 | 超碰97人人人人人蜜桃 | 久久综合九九 | 久久久久91| 日韩在线视频一区 | 超碰美女在线 | av先锋资源 | 国产99久久精品一区二区永久免费 | 羞羞视频在线观看 | 日韩av成人 | 成人片免费看 | 男女视频在线免费观看 | 国产特级毛片 | 99久久99| 北条麻妃一区二区三区在线观看 | 亚洲精品欧洲 | 欧美久久久久 | 欧美一区二区三区在线观看视频 | 男女啪啪网址 | 免费久久精品视频 | 亚洲精久 | 欧美成人激情 | 少妇精品久久久久久久久久 | 91精品国产91久久久久久吃药 | 成人精品一区二区三区 | 小视频你懂得 | 妹子干综合| av网站在线免费观看 | 欧美日韩专区 | 在线免费观看黄网 | 亚洲精品一区二区三区蜜桃久 | 日本一区二区高清不卡 | 九九国产在线观看 | aⅴ色国产 欧美 | 日韩精品成人一区二区三区视频 |