數據庫四大特性和隔離級別小記

數據庫四大特性

數據庫的四大特性縮寫爲ACID,分開來說就是原子性(A tomicity)、一致性(C onsistency)、隔離性(I solation)、持久性(D urability)。事務是訪問並可能更新各種數據項的一個程序執行單元。我們要求數據庫系統維護事務的ACID性質。

  • 原子性:事務的所有操作在數據庫中要麼全部正確反映出來,要麼完全不反映。
  • 一致性:隔離執行事務時(在沒有其他事務併發執行的情況下)保持數據庫的一致性。
  • 隔離性:指併發的事務是相互隔離的。
  • 持久性:一個事務成功完成後,它對數據庫的改變必須是永久的,即使出現系統故障。

一個銀行轉賬的例子:
假設A賬戶中有1000元,B賬戶有2000元,存在一個事務,賬戶A向賬戶B轉賬50元。

  • 原子性:A在向B轉賬過程中,出現了系統故障,A賬戶剩餘950元,而B賬戶未收到轉賬,依舊爲2000元,此時狀態稱爲不一致狀態,爲了維護事務的原子性,我們需要從日誌中恢復舊值(對於寫操作,數據庫系統在磁盤上記錄其舊值,這個信息記錄在一個稱爲日誌的文件中),此時A賬戶恢復爲1000元,B賬戶爲2000元。
  • 一致性:此時的一致性,要求轉賬前後A+B的賬戶總金額不變。
  • 隔離性:假設在轉賬過程中,A賬戶金額轉出50元,而B賬戶金額未到賬,此時存在並行事務T想要讀取A、B賬戶金額總和,若此時讀取,會讀到不一致數據,此時解決方案之一是讓T事務在轉賬完成後串行執行。關於併發事務的隔離級別,下文會有更詳細的介紹,爲了保證數據庫的高效性,實際系統中有更多的併發控制方案。
  • 持久性:一旦轉賬成功執行,系統就必須保證任何系統故障都不會引起與這次轉賬相關的數據丟失。

事務隔離性級別

爲了提高數據庫系統的資源利用率和吞吐量以及減少等待時間等,事務處理系統允許多個事務併發的執行。由此承接銀行轉賬例子中的隔離性,爲了保證數據庫的高併發性,SQL標準允許事務以一種不可串行化的方式執行。存在以下幾個隔離性級別:

  • 可串行化(serializable):併發事務以串行方式執行。
  • 可重複讀(repeatable read):只允許讀取已提交數據,而且在一個事務兩次讀取一個數據項期間,其他事務不得更新該數據。
  • 已提交讀(read committed):只允許讀取已提交數據,但不要求可重複讀。比如,在事務兩次讀取一個數據項期間,另一個事務更新了該數據並提交。
  • 未提交讀(read uncommitted):允許讀取未提交數據。最低一致性級別。

以上所有隔離級別都不允許髒寫,即如果一個數據項已經被另外一個尚未提交或中止的事務寫入,則不允許對該數據項執行寫操作。
與隔離性相關的幾個名詞:
髒讀:指一個事務讀取了另一個未提交的事務。
幻讀(虛讀):是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。一個事務中包含兩次讀操作,在第二次讀之前,其他事務進行了修改,導致事務1兩次讀的結果不同。
mysql數據庫默認的事務隔離級別是:Repeatable read(可重複讀)

參考鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章