閱讀399 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據庫事務學習筆記

水平有限,有錯誤之處望大神們指出,不勝感激

什麼是事務

引用《高性能Mysql》中的定義:
事務就是一組原子性的sql查詢,或者說一個獨立的工作單元。如果數據庫引擎能夠成功的對數據庫應用該組查詢。如果其中有任何一條語句因為崩潰或其他原因無法執行,那麼所有的語句都不會執行。也就是說,事務內的語句,要麼全部執行成功,要麼全部執行失敗。

事務的特性

  • 原子性(Atomicity) 一個事務中的所有sql操作是一個整體,要麼全部成功提交,要麼全部失敗回滾,不允許中間狀態。 原子性的語義,隻保證記錄了回滾段,這個回滾段能夠回滾到之前的版本。 為了實現原子性,需要通過undo日誌。將所有對數據的更新操作寫入日誌,如果一個事務中執行了一部分操作,後麵的操作由於斷電/係統崩潰等其他原因無法繼續,則通過回溯日誌,將已經執行過的操作撤銷,從而達到“全部失敗回滾”的目的。 場景:數據庫係統崩潰後重啟,此時數據庫處於不一致的狀態,必須先執行一個crash recovery的過程,讀取日誌進行redo(重新執行將所有已經成功提交但為寫入磁盤的操作,保證持久性),再對所有崩潰時未成功提交的事務進行undo(撤銷所有執行了一部分但尚未比較的操作,保證原子性)。crash recovery結束後,數據庫恢複到一致性狀態。
  • 一致性(Consistency) 書本定義:數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。 就我個人的理解,事務的ACID中,一致性是最基本的屬性,其他的三個屬性都是為了保證一致性而存在的。首先我覺得我們可以把數據庫的一致性狀態和一個事務單元的一致性拆開來說。數據庫的一致性就是一個係統的狀態,一個合理的狀態。而是否合理這表現在這個狀態是否符合業務規則。比如說A給B轉戰,業務要求總額不變,那麼這個一致性狀態就是總金額相同。當我們的代碼中寫了A = A-100時,就必須再寫上B = B+100才能保證一致性,否則數據庫就處於不一致的狀態。那麼事務單元的一致性是什麼?就是在事務開始和結束時,要麼是A=100/B=0的狀態要麼是A=0/B=100的狀態。這跟原子性的概念又有些重合了。但是在有些情況下,比如說事務1執行完A=A-100時,事務2執行了A=A+200,事務2結束,但是事務1回滾了到了A=100/B=0,此時整個數據庫少了200,違背了一致性。所以事務如果具備一致性能保證什麼?一致性保證一個事務單元全部操作結束了之後才可見,事務開始和結束之間的中間狀態不會被其他事務所看到,開始和結束時的狀態相同。結合上麵來看,在強一致性的保證下,事務與事務之間保持happen-before關係,那麼數據庫一定是處於一致性的狀態。
  • 隔離性(Isolation) 書本定義:事務的執行不受其他事務的幹擾,事務執行的中間結果對其他事務必須是透明的。 這個的定義感覺又跟一致性很像,其實在序列化讀寫這個隔離級別下,就相當於保證了事務的強一致性。但是這樣做的代價就是性能很差。 所以隔離性的引入,其實是以性能為理由,對一致性的破壞。核心目的,就是盡可能的提高並行度。
  • 持久性(Durability) 每一次的事務提交後就會保證不會丟失。這個沒什麼好說的。 ### 事務的隔離級別

最後更新:2017-11-11 03:33:33

  上一篇:go  讓搜索引擎看來更自然的高質量外鏈維度
  下一篇:go  5G超密集組網驅動光模塊市場爆發