數據庫一致性理解
本文摘自知乎:
https://www.zhihu.com/question/31346392/answer/51924208
原子性:記錄之前的版本,允許回滾
一致性:事務開始和結束之間的中間狀態不會被其他事務看到
隔離性:適當的破壞一致性來提升性能與並行度 例如:最終一致~=讀未提交。
持久性:每一次的事務提交後就會保證不會丟失
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
講道理
定義:數據庫一致性(Database Consistency)是指事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
數據庫狀態如何變化?每一次數據變更就會導致數據庫的狀態遷移。如果數據庫的初始狀態是C0,第一次事務T1的提交就會導致系統生成一個SYSTEM CHANGE NUMBER(SCN),這是數據庫狀態從C0轉變成C1。執行第二個事務T2的時候數據庫狀態從T1變成T2,以此類推,執行第Tn次事務的時候數據庫狀態由C(n-1)變成Cn。
定義一致性主要有2個方面,一致讀和一致寫。
一致寫:事務執行的數據變更只能基於上一個一致的狀態,且只能體現在一個狀態中。T(n)的變更結果只能基於C(n-1),C(n-2), ...C(1)狀態,且只能體現在C(n)狀態中。也就是說,一個狀態只能有一個事務變更數據,不允許有2個或者2個以上事務在一個狀態中變更數據。至於具體一致寫基於哪個狀態,需要判斷T(n)事務是否和T(n-1),T(n-2),...T(1)有依賴關系。
一致讀:事務讀取數據只能從一個狀態中讀取,不能從2個或者2個以上狀態讀取。也就是T(n)只能從C(n-1),C(n-2)... C(1)中的一個狀態讀取數據,不能一部分數據讀取自C(n-1),而另一部分數據讀取自C(n-2)。
擺事實
一致寫:
定義100個事務T(1)...T(100)實現相同的邏輯 update table set i=i+1,i的初始值是0,那麽並發執行這100個事務之後i的值是多少?可能很容易想到是100。那麽怎麽從一致性角度去理解呢?
數據庫隨機調度到T(50)執行,此時數據庫狀態是C(0),而其它事務都和T(50)有依賴關系,根據寫一致性原理,其它事務必須等到T(50)執行完畢後數據庫狀態變為C(1)才可以執行。因此數據庫利用鎖機制阻塞其它事務的執行。直到T(50)執行完畢,數據庫狀態從C(0)遷移到C(1)。數據庫喚醒其它事務後隨機調度到T(89)執行,以此類推直到所有事務調度執行完畢,數據庫狀態最終變為C(100)。
一致讀:
還是上面的例子,假設T(1)...T(100)順序執行,在不同的時機執行select i from table,我們看到i的值是什麽?
1. T(1)的執行過程中。數據庫狀態尚未遷移,讀到的i=0
2. T(1)執行完畢,T(2)的執行過程中,數據庫狀態遷移至C(1),讀到的i=1
數據庫一致性理解