A. 什麼是數據一致性和完整性,如何保證
數據一致性通常指關聯數據之間的邏輯關系是否正確和完整.而數據存儲的一致性模型則可以認為是存儲系統和數據使用者之間的一種約定.如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果常用的一致性模型有:
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約束.外鍵來一一實現.這個使用較多.
B. 資料庫的acid中的一致性到底是什麼意思
數據一致性通常指關聯數據之間的邏輯關系是否正確和完整。而數據存儲的一致性模型則可以認為是存儲系統和數據使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果
常用的一致性模型有:
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操作發生後,所有使用者應該可以看到該操作。
C. 一致性約束是什麼意思
每個關系變數都受制於一系列一致性約束,也可以把它們簡稱為一致性約束。在「關系和關系變數」已經知道,任何一個給定的關系變數都被約束為一個確定的類型(具體來說,是一個確定的關系類型),也就是說,在定義關系變數的時候,這個類型也就確定了。
VARSBASERELATION
{SNOCHAR,SNAMECHAR,STATUSINTEGER,CITYCHAR}
KEY{SNO};
這個定義清晰地表明了關系變數S屬於類型RELATION {SNO CHAR, SNAME CHAR, STATUS INTEGER, CITY CHAR}。而且,具體來看它還表明了屬性SNO、SNAME、STATUS和CITY分別是CHAR、CHAR、INTEGER和CHAR這幾種數據類型。
(3)資料庫的一致性約束擴展閱讀
INSERT操作給目標關系變數插入了一系列數組,DELETE操作將一系列數組從目標關系變數中刪除。而更廣義地來講,關系賦值將一系列數組值賦給了目標關系變數。
一致性約束的檢查要在「所有的」更新步驟(包括與之相關的補償性操作,如果有的話)全部完成後進行。換句話說也就是從邏輯上講,一個集合級別的更新一定不能被當作一系列單獨數組級別的更新來對待。
D. 如何理解資料庫事務一致性
定義:資料庫一致性(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
E. 資料庫事務一致性
一致性(Consistent)(Consistency) 事務在完成時,必須使所有的數據都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制所有已知的完整性約束。如,當開發用於轉賬的應用程序時,應避免在轉賬過程中任意移動小數點。隔離性(Insulation)(Isolation) 由並發事務所作的修改必須與任何其它並發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一並發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱為隔離性,因為它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續運行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程序降低隔離級別以換取更大的吞吐量。持久性(Duration)(Durability) 事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
F. 資料庫有哪幾種類型約束
主鍵約束(Primary Key constraint):要求主鍵列數據唯一,並且不允許為空。
唯一約束(Unique constraint):要求該列唯一,允許為空,但只能出現一個空值。
檢查約束(Check constraint):某列取值范圍限制,格式限制等,如有關年齡、郵箱(必須有@)的約束。
默認約束(Default constraint):某列的默認值,如在資料庫里有一項數據很多重復,可以設為默認值。
外鍵約束(Foreign Key constraint):用於在兩個表之間建立關系,需要指定引用主表的哪一列。
(6)資料庫的一致性約束擴展閱讀
主鍵約束在表中定義一個主鍵來唯一確定表中每一行數據的標識符。
(非空,唯一)
例如:
alter table member
add
constraint PK_member_member_no primary key clustered (member_no)
主鍵列的數據類型不限,但此列必須是唯一並且非空。
如該表中已有主鍵為1000的行,則不能再添加主鍵為1000。
人工或程序不好控制的時候,也可以設置主鍵列為自動增長列。
主鍵主要用在查詢單調數據,修改單調數據和刪除單調數據上。做程序的時候,都將表的主鍵設置為int型的可自增的列,這樣在編程的時候,很容易區分數據。
G. 什麼是資料庫一致性
資料庫一致性(Database
Consistency)
是指事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。
保證資料庫一致性是指當事務完成時,必須使所有數據都具有一致的狀態。在關系型資料庫中,所有的規則必須應用到事務的修改上,以便維護所有數據的完整性。
保證資料庫的一致性是資料庫管理系統的一項功能.比如有兩個表(員工\職位),員工表中有員工代碼、姓名、職位代碼等屬性,職位表中有職位代碼、職位名稱、職位等級等屬性。你在其中員工表中進行了插入操作,你插入了一個新員工的信息,而這個新員工的職位是公司新創建的一個職位。如果沒有一致性的保證,就會出現有這么一個員工,但是不知道他到底擔當什麼職責!這個只是它的一個小小方面。
讀一致性也是資料庫一致性的一個重要方面,在實際中,我們會遇到這種情況:我們對一個表中的某些數據進行了更新操作,,但是還沒有進行提交,這時另外一個用戶讀取表中數據.這個時候就出現了讀一致性的問題:到底是讀什麼時候的數據呢?是更新前的還是更新後的?在DBMS中設有臨時表,它用來保存修改前的值,在沒有進行提交前讀取數據,會讀取臨時表中的數據,這樣一來就保證了數據是一致的.(當前用戶看到的是更新後的值)
但是還有一種情況:用戶user1對表進行了更新操作,用戶user2在user1還沒有進行提交前讀表中數據,而且是大批量的讀取(打個比方:耗時3分鍾)而在這3分鍾內user1進行了提交操作,那又會產生什麼影響呢?這個時候怎麼保證讀寫一致性呢?這個時候DBMS就要保證有足夠大的臨時表來存放修改前的數值,,以保證user2讀取的數據是修改前的一致數據.然後下次再讀取時候就是更新後的數據了.
H. 資料庫的一致性是什麼有什麼作用
資料庫一致性(Database Consistency)是指事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。保證資料庫一致性是指當事務完成時,必須使所有數據都具有一致的狀態。在關系型資料庫中,所有的規則必須應用到事務的修改上,以便維護所有數據的完整性。
保證資料庫的一致性是資料庫管理系統的一項功能.比如有兩個表(員工職位),員工表中有員工代碼、姓名、職位代碼等屬性,職位表中有職位代碼、職位名稱、職位等級等屬性。你在其中員工表中進行了插入操作,你插入了一個新員工的信息,而這個新員工的職位是公司新創建的一個職位。如果沒有一致性的保證,就會出現有這么一個員工,但是不知道他到底擔當什麼職責!這個只是它的一個小小方面。
讀一致性也是資料庫一致性的一個重要方面,在實際中,我們會遇到這種情況:我們對一個表中的某些數據進行了更新操作,,但是還沒有進行提交,這時另外一個用戶讀取表中數據.這個時候就出現了讀一致性的問題:到底是讀什麼時候的數據呢?是更新前的還是更新後的?在DBMS中設有臨時表,它用來保存修改前的值,在沒有進行提交前讀取數據,會讀取臨時表中的數據,這樣一來就保證了數據是一致的.(當前用戶看到的是更新後的值)
但是還有一種情況:用戶user1對表進行了更新操作,用戶user2在user1還沒有進行提交前讀表中數據,而且是大批量的讀取(打個比方:耗時3分鍾)而在這3分鍾內user1進行了提交操作,那又會產生什麼影響呢?這個時候怎麼保證讀寫一致性呢?這個時候DBMS就要保證有足夠大的臨時表來存放修改前的數值,以保證user2讀取的數據是修改前的一致數據.然後下次再讀取時候就是更新後的數據了。
I. 資料庫系統中 數據的一致性指的是什麼
同步更新。
簡單說來就是一條column的數據在多個表中保持同步更新, 一般用foreign key實現mapping
比如兩張表table1,table2
其中table1的uid column是primary key,table2的uid column是foreign key,
則當修改table1的uid column的一row時,table2的對應row也會自動更新。
(9)資料庫的一致性約束擴展閱讀:
常用的一致性模型有:
1、嚴格一致性(linearizability, strict/atomic Consistency):讀出的數據始終為最近寫入的數據。這種一致性只有全局時鍾存在時才有可能,在分布式網路環境不可能實現。
2、順序一致性(sequential consistency):所有使用者以同樣的順序看到對同一數據的操作,但是該順序不一定是實時的,等。