標籤:

好書一起讀(168):重學資料庫之事務

讀《資料庫系統實現》來鞏固資料庫基礎。

資料庫三大要點:持久,查詢,事務。這篇說事務。

事務的兩大目標,一是「可恢復」,即通過日誌保證資料庫動作可恢復,二是「好並發」,即通過調度器保證事務正確的並發。

關於「可恢復」,要點是日誌。日誌分為三種,undo日誌只存舊值,redo日誌只存新值,undo/redo日誌既存舊值又存新值。

關於「好並發」,要點是調度器。調度是來自一個或多個事務的讀寫動作的序列。最常用的方法是封鎖。鎖分為共享鎖和排他鎖。共享鎖允許讀不允許寫,排他鎖既不允許讀也不允許寫。

資料庫對待並發的方法,與我們在編程語言中學到的是一樣的——大家都改同一個狀態容易亂,那就通過調度,一個一個來。誰先來的,就讓誰先改,這時把狀態鎖住,讓其他人碰不到。

但如果大家都是僅僅要讀,那倒可以大家一起來讀,反正在這個情況下可以把狀態視為只讀狀態,只讀狀態不存在並發問題,多少人一起讀都不怕。這就是共享鎖。

這時如果有誰要寫,那其他人都不可以讀了,要等他寫完再讀。這就是排他鎖。

寫的動作,是將世界從一個狀態導向另一個狀態,這個新狀態,資料庫有責任好好地保存,即使內存或磁碟出了問題,也能恢復。

防止內存出問題,我們使用日誌;防止磁碟出問題,我們使用備份。

這就好比我們讀書有了點心得,怕忘,就寫筆記發到博客上,這就是日誌;為避免博客網站抽風,我們將博文發到不止一個平台上,這就是備份。

這保證了數據不丟失,從而可以將內存中的狀態恢復到正確的樣子。

這就避免了學了忘,努力被湮沒,狗熊掰棒子,西緒福斯推石頭的悲劇。我們的每一個進步,都扎紮實實,牢牢靠靠,即使忘記,也能方便地找回來。我們成了更強大的人,不會一時懶散就回歸孱弱。

我們的日誌就是進步的軌跡,這份資料,如果別人拿去,也能亦步亦趨地,主從複製地,同樣獲得進步。當然,他的起點要和我們差不多。

但進步,也要一個點一個點來做,CPU切換上下文需要成本,人腦就更是,保持專註,才能進步效率最大化。

就像我們開啟一個事務,一股腦做完許多事,再一起提交,這比反覆開啟事務提交事務效率要高很多。

但既然開啟了事務,就意味著,其他的事務這時要等待,我的大腦,在這段時間,只對這個課題負責,別的一概不想,因為排他鎖不允許並發。

能夠用整塊的時間進行學習和實踐真是幸福的事情。

這一股腦事情做完了,事務就提交,自己就變到了新的狀態,與此同時日誌和備份也出現在適當的地方。

我學會了新的東西,有了進步,很開心,而且不用擔心以後忘記,反正隨時能恢復它。


推薦閱讀:

好書一起讀(166):重學資料庫之存儲
如何用資料庫中的賬號密碼,去登錄指定php網頁文件,然後才能訪問下個界面?求解?
國產資料庫發展情況如何?
2017 年該學習的編程語言、框架和工具
如何探究電影時長和製作年代的關係?

TAG:数据库 |