對資料庫的丟失修改 髒讀 不可重複讀 虛讀的理解

2021-09-26 03:16:11 字數 1953 閱讀 3329

首先看乙個簡單的例子:

考慮飛機訂票系統的乙個活動序列:

(1)甲售票點(事務t1)讀出某航班的機票餘額a,設a=16.

(2)乙售票點(事務t2)讀出同一航班的機票餘額a,也為16.

(3)甲售票點賣出一張機票,修改餘額a←a-1.所以a為15,把a寫回資料庫.

(4)乙售票點也賣出一張機票,修改餘額a←a-1.所以a為15,把a寫回資料庫.

結果明明賣出兩張機票,資料庫中機票餘額只減少1。

這種情況稱為資料庫的不一致性。這種不一致性是由事務的併發操作引起的。在併發的操作情況下,如果沒有任何的併發控制機制,對事務t1、t2的兩個事務的操作序列的排程是隨機的。若按照上面的排程序列執行,t1事務的修改就被丟失了(丟失可以理解成為失效)。這是由於第4步中t2事務對a進行修改了,並且寫回資料庫覆蓋了t1事務做出的修改。

併發操作帶來的資料不一致性包括丟失修改、不可重複讀和讀「髒」資料。

課本原文中並沒有提到虛讀(也有人稱為幻讀)。

兩個事務t1和t2讀入同一資料並修改,t2提交的結果破壞了t1提交的結果,導致了t1的修改失效了。飛機訂票的例子就屬於此類。

讀"髒"資料是指當事務t1修改某一資料時,事務t2讀取同一資料後,t1由於某種原因撤銷修改了,這時t1已修改過的資料恢復原值,而t2讀到的資料是撤銷修改之前的資料,那麼此時t2的資料就與資料庫中的資料不一致,則t2讀到的資料就為"髒"資料,即不正確的資料。

不可重複讀是指事務t1讀取資料後,事務t2執行更新操作,使t1無法再現前一次讀取結果。具體的,不可重複讀包括三種情況:

(1)事務t1讀取某一資料後,事務t2對其做了修改,當事務1再次讀該資料時,得到與前一次不同的值。例如,t1讀取b=100進行運算,t2讀取同一資料b,對其進行修改後將b=200寫回資料庫。t1為了對讀取值校對重讀b,b已為200,與第一次讀取值不一致。

(2)事務t1按一定條件從資料庫中讀取了某些資料記錄後,事務t2刪除了其中部分記錄,當t1再次按相同條件讀取資料時,發現某些記錄神密地消失了。

(2)事務t1按一定條件從資料庫中讀取某些資料記錄後,事務t2插入了一些記錄,當t1再次按相同條件讀取資料時,發現多了一些記錄。

事務a首先根據條件索引得到n條資料,然後事務b在n條之外刪除或者增加了m條符合事務a搜尋條件的資料,導致事務a再次搜尋發現有n+m條資料了,就產生了虛讀。虛讀貌似是mysql中的概念?

這麼看的話,虛讀不就是不可重複讀中的第

二、三種情況嗎???

產生上述四類資料不一致性的主要原因是併發操作破壞了事務的隔離性。併發控制就是要用正確的方式排程併發操作,使乙個使用者事務的執行不受其它事務的干擾,從而避免造成資料的不一致性。

有了以上的資料不一致性,那麼資料庫肯定要有相應的處理事務並行辦法。

資料庫的隔離級別越高,越能解決更多的資料不一致性問題。但是也是要犧牲的效能也逐漸遞增。

以下事務隔離級別逐漸增加。

這種通常不討論。

顧名思義,就是在事務a未提交的時候,事務b可以進行讀寫。這種級別下,資料庫會出現丟失修改、不可重複讀、髒讀和虛讀等資料不一致性問題。

顧名思義,就是只有在事務a已經提交的時候,事務b才可以進行讀寫。這種級別下,資料庫不會出現在事務a執行過程中,b去讀寫的情況,那麼b也不會出現髒讀了。所以此級別可以避免髒讀,但是不能避免可重複讀以及虛讀。

顧名思義,這種級別可以避免不可重複讀,也能避免髒讀。但不能避免虛讀。

最高隔離級別。可以避免所有的資料不一致性問題。

個人理解:事務的隔離級別本質其實是底層使用了不同的封鎖協議。因為封鎖是實現併發控制的乙個非常重要的技術。

**於:

補充:基本的封鎖型別有兩種:排它鎖(又稱為x鎖或者寫鎖)和共享鎖(又稱為s鎖或者讀鎖)。

讀鎖之間可以共享,寫鎖既不能共享寫鎖也不能共享讀鎖。

資料庫中的丟失更新,髒讀,不可重複讀,幻讀

a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。髒讀發生在乙個事務a讀取了被另乙個事務b修改,但是還未提交的資料。假如b回退,則事務a讀取的是無效的資料。指在乙個事務a內,多次讀同乙個資料,但是事務a沒有結束時,另外乙個事務b則修改了該資料。那麼事務a在 b事務修改資料之後再次讀取該資料,a事務讀...

資料庫幻讀 髒讀 不可重複讀

要理解幻讀 髒讀 不可重複讀,必須先搞清楚事務的隔離級別 資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。隔離級別 髒讀不可重...

資料庫髒讀 不可重複讀 幻讀

資料庫髒讀 不可重複讀 幻讀 1.髒讀 髒讀就是指當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。2.不可重複讀 是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個...