資料庫

MuxLz發表於2024-10-31

資料庫

事務

事務(Transaction)指一個操作,由多個步驟組成,要麼全部成功,要麼全部失敗。

舉例:轉賬,假設A賬戶向B賬號轉賬,那麼涉及兩個操作:

從 A 賬戶扣錢。
往 B 賬戶加入等量的錢。

在這種場景下,不能A 賬戶扣了錢,B 賬戶卻沒加錢的情況,要麼同時成功,要麼同時失敗並回滾。

事務四大特性

A 原子性(Atomicity):作為一個整體,包含在其中的對資料庫的操作要麼全部被執行,要麼都不執行

C 一致性(Consistency):事務在執行前後,資料庫必須滿足一些預定義的一致性規則,否則回滾

I 隔離性(Isolation):多個事務併發執行時,一個事務的執行不影響其他事務的執行

D 永續性(Durability):已被提交的事務對資料庫的修改應該永久儲存在資料庫中

事務併發問題

  • 髒讀(Dirty Read):讀取未提交資料。

    事務 A 讀取事務 B 尚未提交的資料,此時如果事務 B 發生錯誤並回滾,那麼事務 A 讀取到的資料就是髒資料。

  • 不可重複讀(Non-repeatable Read):前後多次讀取,資料內容不一致。

    事務 A 在事務 B 開始前讀和事務 B 結束後讀的資料不一樣,因為資料被事務 B 修改了。

  • 幻讀(Phantom Read):同一個查詢在不同時間產生不同的結果集

    事務 A 在讀取某個範圍內的記錄時,事務 B 在該範圍內插入了新記錄或刪除了舊記錄,事務 A 再次讀取該範圍內的記錄時,前後獲取的結果集不同,產生了幻讀。

事務隔離級別

  • 讀未提交(Read Uncommitted)
  • 讀已提交(Read Committed)
  • 可重複讀(Repeatable Read)
  • 序列化(Serializable)

image-20241031095628390

MVCC

多版本併發控制,以樂觀鎖為理論基礎。

透過對資料行的多個版本管理來實現資料庫的併發控制。這樣就可以透過比較版本號決定資料是否顯示,讀取資料時不需要加鎖也可保證事務的隔離效果。

MVCC 的核心實現主要基於兩部分:版本鏈和讀檢視

MVCC 透過版本鏈實現多版本管理,透過 Read View 生成策略的不同實現,實現「讀已提交」和「可重複讀」這兩種隔離級別。

  • 「讀已提交」每次查詢都會重新生成一個 Read View,做到每次提交後的資料可被當前事務讀到。
  • 「可重複讀」一直使用啟動事務時生成的 Read View,直到當前事務提交,以此保證可重複讀。

相關文章