資料庫數據的一致性
A. 資料庫系統中 數據的一致性指的是什麼
同步更新。
簡單說來就是一條column的數據在多個表中保持同步更新, 一般用foreign key實現mapping
比如兩張表table1,table2
其中table1的uid column是primary key,table2的uid column是foreign key,
則當修改table1的uid column的一row時,table2的對應row也會自動更新。
(1)資料庫數據的一致性擴展閱讀:
常用的一致性模型有:
1、嚴格一致性(linearizability, strict/atomic Consistency):讀出的數據始終為最近寫入的數據。這種一致性只有全局時鍾存在時才有可能,在分布式網路環境不可能實現。
2、順序一致性(sequential consistency):所有使用者以同樣的順序看到對同一數據的操作,但是該順序不一定是實時的,等。
B. 如何理解資料庫的內部一致性和外部一致性
1. 定義:資料庫一致性是指事務執行的結果必須使資料庫從一個一致性狀態變到另一個一致性狀態。每一次數據變更都會導致資料庫狀態的遷移。如果資料庫的初始狀態是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)有依賴關系。
3. 一致讀:事務讀取數據只能從一個狀態中讀取,不能從2個或者2個以上狀態中讀取。也就是說,T(n)只能從C(n-1),C(n-2)... C(1)中的一個狀態讀取數據,不能一部分數據讀取自C(n-1),而另一部分數據讀取自C(n-2)。
4. 事實舉例:假設定義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)。
5. 事實舉例:還是上面的例子,假設T(1)...T(100)順序執行,在不同的時機執行select i from table,我們看到i的值是什麼?1. 在T(1)的執行過程中,資料庫狀態尚未遷移,讀到的i=0。2. 在T(1)執行完畢,T(2)的執行過程中,資料庫狀態遷移至C(1),讀到的i=1。