資料庫
事務
事務(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)
MVCC
多版本併發控制,以樂觀鎖為理論基礎。
透過對資料行的多個版本管理來實現資料庫的併發控制。這樣就可以透過比較版本號決定資料是否顯示,讀取資料時不需要加鎖也可保證事務的隔離效果。
MVCC 的核心實現主要基於兩部分:版本鏈和讀檢視。
MVCC 透過版本鏈實現多版本管理,透過 Read View 生成策略的不同實現,實現「讀已提交」和「可重複讀」這兩種隔離級別。
- 「讀已提交」每次查詢都會重新生成一個 Read View,做到每次提交後的資料可被當前事務讀到。
- 「可重複讀」一直使用啟動事務時生成的 Read View,直到當前事務提交,以此保證可重複讀。