什麼是資料庫的一致性
『壹』 資料庫系統中 數據的一致性指的是什麼
同步更新。
簡單說來就是一條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):所有使用者以同樣的順序看到對同一數據的操作,但是該順序不一定是實時的,等。
『貳』 資料庫的完整性、一致性、正確性是什麼分別舉例說明
完整性 是指主鍵上的值不能為空. 比如關系R(學生號,學生姓名,成績)學生號為主鍵那它就不能為空否則違反規則.
一致性就是要始終保證數據的正確性 比如你去銀行轉錢你轉1000但卡里只有300執行事務時查詢到你金額不足就會返回拒絕執行而不是把你卡里的300轉走,依然保持你卡里之前的金額300這就是一致性.恢復到事務的初始狀態.
正確性書面語言應該叫原子性吧 原子性是指 任何事務如果執行要麼全部執行要麼什麼都不做.
比如 你去銀行轉錢 。轉50給別人如果開始執行就必須要把50轉到對方卡上.如果出現異常則拒絕執行.
『叄』 如何理解資料庫事務一致性
定義:資料庫一致性(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)。
『肆』 資料庫事務原子性,一致性是怎樣實現的
這個問題的有趣之處,不在於問題本身(「原子性、一致性的實現機制是什麼」),而在於回答者的分歧反映出來的另外一個問題:原子性和一致性之間的關系是什麼?
我特別關注了@我練功發自真心
的答案,他正確地指出了,為了保證事務操作的原子性,必須實現基於日誌的REDO/UNDO機制。但這個答案仍然是不完整的,因為原子性並不能夠完全保證一致性。
按照我個人的理解,在事務處理的ACID屬性中,一致性是最基本的屬性,其它的三個屬性都為了保證一致性而存在的。
首先回顧一下一致性的定義。所謂一致性,指的是數據處於一種有意義的狀態,這種狀態是語義上的而不是語法上的。最常見的例子是轉帳。例如從帳戶A轉一筆錢到帳戶B上,如果帳戶A上的錢減少了,而帳戶B上的錢卻沒有增加,那麼我們認為此時數據處於不一致的狀態。
在
資料庫實現的場景中,一致性可以分為資料庫外部的一致性和資料庫內部的一致性。前者由外部應用的編碼來保證,即某個應用在執行轉帳的資料庫操作時,必須在
同一個事務內部調用對帳戶A和帳戶B的操作。如果在這個層次出現錯誤,這不是資料庫本身能夠解決的,也不屬於我們需要討論的范圍。後者由資料庫來保證,即
在同一個事務內部的一組操作必須全部執行成功(或者全部失敗)。這就是事務處理的原子性。
為了實現原子性,需要通過日誌:將所有對
數據的更新操作都寫入日誌,如果一個事務中的一部分操作已經成功,但以後的操作,由於斷電/系統崩潰/其它的軟硬體錯誤而無法繼續,則通過回溯日誌,將已
經執行成功的操作撤銷,從而達到「全部操作失敗」的目的。最常見的場景是,資料庫系統崩潰後重啟,此時資料庫處於不一致的狀態,必須先執行一個crash
recovery的過程:讀取日誌進行REDO(重演將所有已經執行成功但尚未寫入到磁碟的操作,保證持久性),再對所有到崩潰時尚未成功提交的事務進行
UNDO(撤銷所有執行了一部分但尚未提交的操作,保證原子性)。crash
recovery結束後,資料庫恢復到一致性狀態,可以繼續被使用。
日誌的管理和重演是資料庫實現中最復雜的部分之一。如果涉及到並行處理和分布式系統(日誌的復制和重演是資料庫高可用性的基礎),會比上述場景還要復雜得多。
但是,原子性並不能完全保證一致性。在多個事務並行進行的情況下,即使保證了每一個事務的原子性,仍然可能導致數據不一致的結果。例如,事務1需要將100元轉入帳號A:先讀取帳號A的值,然後在這個值上加上100。但是,在這兩個操作之間,另一個事務2修改了帳號A的值,為它增加了100元。那麼最後的結果應該是A增加了200元。但事實上,
事務1最終完成後,帳號A只增加了100元,因為事務2的修改結果被事務1覆蓋掉了。
為了保證並發情況下的一致性,引入了隔離性,即保證每一個事務能夠看到的數據總是一致的,就好象其它並發事務並不存在一樣。用術語來說,就是多個事務並發執行後的狀態,和它們串列執行後的狀態是等價的。怎樣實現隔離性,已經有很多人回答過了,原則上無非是兩種類型的鎖:
一
種是悲觀鎖,即當前事務將所有涉及操作的對象加鎖,操作完成後釋放給其它對象使用。為了盡可能提高性能,發明了各種粒度(資料庫級/表級/行級……)/各
種性質(共享鎖/排他鎖/共享意向鎖/排他意向鎖/共享排他意向鎖……)的鎖。為了解決死鎖問題,又發明了兩階段鎖協議/死鎖檢測等一系列的技術。
一種是樂觀鎖,即不同的事務可以同時看到同一對象(一般是數據行)的不同歷史版本。如果有兩個事務同時修改了同一數據行,那麼在較晚的事務提交時進行沖突
檢測。實現也有兩種,一種是通過日誌UNDO的方式來獲取數據行的歷史版本,一種是簡單地在內存中保存同一數據行的多個歷史版本,通過時間戳來區分。
鎖也是資料庫實現中最復雜的部分之一。同樣,如果涉及到分布式系統(分布式鎖和兩階段提交是分布式事務的基礎),會比上述場景還要復雜得多。
@
我練功發自真心
提到,其他回答者說的其實是操作系統對atomic的理解,即並發控制。我不能完全同意這一點。資料庫有自己的並發控制和鎖問題,雖然在原理上和操作系統
中的概念非常類似,但是並不是同一個層次上的東西。資料庫中的鎖,在粒度/類型/實現方式上和操作系統中的鎖都完全不同。操作系統中的鎖,在資料庫實現中
稱為latch(一般譯為閂)。其他回答者回答的其實是「在並行事務處理的情況下怎樣保證數據的一致性」。
最後回到原來的問題(「原子性、一致性的實現機制是什麼」)。我手頭有本Database
System
Concepts(4ed,有點老了),在第15章的開頭簡明地介紹了ACID的概念及其關系。如果你想從概念上了解其實現,把這本書的相關章節讀完應該能大概明白。如果你想從實踐上了解其實現,可以找innodb這樣的開源引擎的源代碼來讀。不過,即使是一個非常粗糙的開源實現(不考慮太復雜的並行處理,不考慮分布式系統,不考慮針對操作系統和硬體的優化之類),要基本搞明白恐怕也不是一兩年的事。
『伍』 什麼是數據一致性和完整性,如何保證
數據一致性通常指關聯數據之間的邏輯關系是否正確和完整。而數據存儲的一致性模型則可以認為是存儲系統和數據使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果常用的一致性模型有:
a、嚴格一致性(linearizability, strict/atomic Consistency):讀出的數據始終為最近寫入的數據。這種一致性只有全局時鍾存在時才有可能,在分布式網路環境不可能實現。
b、順序一致性(sequential consistency):所有使用者以同樣的順序看到對同一數據的操作,但是該順序不一定是實時的。
c、因果一致性(causal consistency):只有存在因果關系的寫操作才要求所有使用者以相同的次序看到,對於無因果關系的寫入則並行進行,無次序保證。因果一致性可以看做對順序一致性性能的一種優化,但在實現時必須建立與維護因果依賴圖,是相當困難的。
d、管道一致性(PRAM/FIFO consistency):在因果一致性模型上的進一步弱化,要求由某一個使用者完成的寫操作可以被其他所有的使用者按照順序的感知到,而從不同使用者中來的寫操作則無需保證順序,就像一個一個的管道一樣。 相對來說比較容易實現。
e、弱一致性(weak consistency):只要求對共享數據結構的訪問保證順序一致性。對於同步變數的操作具有順序一致性,是全局可見的,且只有當沒有寫操作等待處理時才可進行,以保證對於臨界區域的訪問順序進行。在同步時點,所有使用者可以看到相同的數據。
f、 釋放一致性(release consistency):弱一致性無法區分使用者是要進入臨界區還是要出臨界區, 釋放一致性使用兩個不同的操作語句進行了區分。需要寫入時使用者acquire該對象,寫完後release,acquire-release之間形成了一個臨界區,提供 釋放一致性也就意味著當release操作發生後,所有使用者應該可以看到該操作。
g、最終一致性(eventual consistency):當沒有新更新的情況下,更新最終會通過網路傳播到所有副本點,所有副本點最終會一致,也就是說使用者在最終某個時間點前的中間過程中無法保證看到的是新寫入的數據。可以採用最終一致性模型有一個關鍵要求:讀出陳舊數據是可以接受的。
h、delta consistency:系統會在delta時間內達到一致。這段時間內會存在一個不一致的窗口,該窗口可能是因為log shipping的過程導致。這是書上的原話。。我也搞不很清楚。。 資料庫完整性(Database Integrity)是指資料庫中數據的正確性和相容性。資料庫完整性由各種各樣的完整性約束來保證,因此可以說資料庫完整性設計就是資料庫完整性約束的設計。包括實體完整性。域完整性。參照完整性。用戶定義完整性。可以主鍵。check約束。外鍵來一一實現。這個使用較多。