資料一致性

2022-03-27 10:56:09 字數 1505 閱讀 3506

丟失更新、未確定的相關性、不一致的分析和幻想讀

事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。

幻讀是指當事務不是獨立執行時發生的一種現象,例如第乙個事務對乙個表中的資料進行了修改,比如這種修改涉及到表中的「全部資料行」。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入「一行新資料」。那麼,以後就會發生操作第乙個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖ranges,鎖定檢鎖範圍為唯讀,這樣就避免了幻讀。  

在資料庫定義的四種隔離級別中,repeatable_read級別可以避免「不可重複讀」的問題,但是仍然避免不了「幻讀」問題,只有最高隔離級別serializable_read才可以保證不出現幻讀的問題。[1]

不可重複讀,是指在資料庫訪問中,乙個事務範圍內兩個相同的查詢卻返回了不同資料。這是由於查詢時系統中其他事務修改的提交而引起的。比如事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。

一種更易理解的說法是:在乙個事務內,多次讀同乙個資料。在這個事務還沒有結束時,另乙個事務也訪問該同一資料。那麼,在第乙個事務的兩次讀資料之間。由於第二個事務的修改,那麼第乙個事務讀到的資料可能不一樣,這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為不可重複讀,即原始讀取不可重複。

當乙個使用者鎖住資料庫中的某個物件時,其他使用者就不能再訪問該物件。加鎖對併發訪問的影響體現在鎖的粒度上。比如,放在乙個表上的鎖限制對整個表的併發訪問;放在資料頁上的鎖限制了對整個資料頁的訪問;放在行上的鎖只限制對該行的併發訪問。可見行鎖粒度最小,併發訪問最好,頁鎖粒度最大,表鎖介於2者之間。鎖有兩種:悲觀鎖和樂觀鎖。悲觀鎖假定其他使用者企圖訪問或者改變你正在訪問、更改的物件的概率是很高的,因此在悲觀鎖的環境中,在你開始改變此物件之前就將該物件鎖住,並且直到你提交了所作的更改之後才釋放鎖。悲觀的缺陷是不論是頁鎖還是行鎖,加鎖的時間可能會很長,這樣可能會長時間的限制其他使用者的訪問,也就是說悲觀鎖的併發訪問性不好。與悲觀鎖相反,樂觀鎖則認為其他使用者企圖改變你正在更改的物件的概率是很小的,因此樂觀鎖直到你準備提交所作的更改時才將物件鎖住,當你讀取以及改變該物件時並不加鎖。可見樂觀鎖加鎖的時間要比悲觀鎖短,樂觀鎖可以用較大的鎖粒度獲得較好的併發訪問效能。但是如果第二個使用者恰好在第乙個使用者提交更改之前讀取了該物件,那麼當他完成了自己的更改進行提交時,資料庫就會發現該物件已經變化了,這樣,第二個使用者不得不重新讀取該物件並作出更改。這說明在樂觀鎖環境中,會增加併發使用者讀取物件的次數。

從資料庫廠商的角度看,使用樂觀的頁鎖是比較好的,尤其在影響很多行的批量操作中可以放比較少的鎖,從而降低對資源的需求提高資料庫的效能。再考慮聚集索引。在資料庫中記錄是按照聚集索引的物理順序存放的。如果使用頁鎖,當兩個使用者同時訪問更改位於同一資料頁上的相鄰兩行時,其中乙個使用者必須等待另乙個使用者釋放鎖,這會明顯地降低系統的效能。interbase和大多數關聯式資料庫一樣,採用的是樂觀鎖,而且讀鎖是共享的,寫鎖是排他的。可以在乙個讀鎖上再放置讀鎖,但不能再放置寫鎖;你不能在寫鎖上再放置任何鎖。鎖是目前解決多使用者併發訪問的有效手段

資料一致性

資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...

資料一致性

資料一致性通常指關聯資料之間的邏輯關係是否正確和完整。而資料儲存的一致性模型則可以認為是儲存系統和資料使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統所承諾的訪問結果。常用的一致性模型有 a 嚴格一致性 linearizability,strict atomic consistency ...

資料一致性

讀請求 先讀快取再讀庫 如果快取命中,返回資料 如果快取未命中,讀庫並把資料寫入快取,然後再返回 寫請求 資料寫庫 刪除快取 這裡很重要的一點在寫請求中,要刪除快取而不是更新快取。快取的更新會發生在下一次讀請求時。這裡為什麼會選擇刪除快取,而沒有更新快取呢。因為如果更新快取的話,存在併發寫操作時,無...