1. 程式人生 > >【資料庫】資料庫併發操作(一)資料庫併發操作帶來的問題

【資料庫】資料庫併發操作(一)資料庫併發操作帶來的問題

多個使用者訪問同一個資料庫時,如果他們的事務同時使用相同的資料,則可能會導致併發問題的產生;
併發操作帶來的資料庫不一致性可以分為四類:

(1)丟失或覆蓋更新

當兩個或多個事務選擇同一資料,並且基於最初選定的值更新該資料時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。上面預定飛機票的例子就屬於這種併發問題。事務1與事務2先後讀入同一資料A=16,事務1執行A-1,並將結果A=15寫回,事務2執行A-1,並將結果A=15寫回。事務2提交的結果覆蓋了事務1對資料庫的修改,從而使事務1對資料庫的修改丟失了。

當兩個或多個事務選擇同一資料,並且基於最初選定的值更新該資料時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。上面預定飛機票的例子就屬於這種併發問題。事務1與事務2先後讀入同一資料A=16,事務1執行A-1,並將結果A=15寫回,事務2執行A-1,並將結果A=15寫回。事務2提交的結果覆蓋了事務1對資料庫的修改,從而使事務1

(2)髒讀

一個事務讀取了另一個未提交的並行事務寫的資料。當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。第二個事務正在讀取的資料還沒有確認並且可能由更新此行的事務所更改。換句話說,當事務1修改某一資料,並將其寫回磁碟,事務2讀取同一資料後,事務1由於某種原因被撤銷,這時事務1已修改過的資料恢復原值,事務2讀到的資料就與資料庫中的資料不一致,是不正確的資料,稱為髒讀。
例如,在下圖中,事務1將C值修改為200,事務2讀到C為200,而事務1由於某種原因撤銷,其修改作廢,C恢復原值100,這時事務2讀到的就是不正確的“髒“資料

(3)不可重複讀

一個事務重新讀取前面讀取過的資料,發現該資料已經被另一個已提交的事務修改過。即事務1讀取某一資料後,事務2對其做了修改,當事務1再次讀資料時,得到的與第一次不同的值。
例如,在下圖中,事務1讀取B=100進行運算,事務2讀取同一資料B,對其進行修改後將B=200寫回資料庫。事務1為了對讀取值校對重讀B,B已為200,與第一次讀取值不一致。

(4)幻像讀

如果一個事務在提交查詢結果之前,另一個事務可以更改該結果,就會發生這種情況。這句話也可以這樣解釋,事務1按一定條件從資料庫中讀取某些資料記錄後未提交查詢結果,事務2刪除了其中部分記錄,事務1再次按相同條件讀取資料時,發現某些記錄神祕地消失了;或者事務1按一定條件從資料庫中讀取某些資料記錄後未提交查詢結果,事務2插入了一些記錄,當事務1再次按相同條件讀取資料時,發現多了一些記錄。

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