資料庫併發操作與資料的不一致性

NO IMAGE

http://www.cnblogs.com/softest/articles/2012585.html

如果沒有鎖定且多個使用者同時訪問一個資料庫,則當他們的事務同時使用相同的資料時可能會發生問題,導致資料庫中的資料的不一致性。 

  一個最常見的併發操作的例子是火車/飛機訂票系統中的訂票操作。例如,在該系統中的一個活動序列: 
  1、甲售票員讀出某航班的機票張數餘額A,設A=16; 
  2、乙售票員讀出同一航班的機票張數餘額A,也是16; 
  3、甲售票員賣出一張機票,修改機票張數餘額A=A-1=15,把A寫回資料庫; 
  4、乙售票員也賣出一張機票,修改機票張數餘額A=A-1=15,把A寫回資料庫。 
  結果明明賣出兩張機票,資料庫中機票餘額只減少1。 
  這種情況稱為資料庫的不一致性。這種不一致性是由甲、乙兩個售票員併發操作引起的。在併發操作情況下,對甲、乙兩個事務操作序列的排程是隨機的。若按上面的排程序列行,甲事務的修改就被丟失。這是由於第4步中乙事務修改A並寫回覆蓋了甲事務的修改。 

  併發操作帶來的資料庫不一致性可以分為四類:丟失或覆蓋更新、髒讀、不可重複讀和幻像讀,上例只是併發問題的一種。 
  (1)丟失或覆蓋更新(lost update) 
  當兩個或多個事務選擇同一資料,並且基於最初選定的值更新該資料時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最後的更新將重寫由其它事務所做的更新,這將導致資料丟失。上面預定飛機票的例子就屬於這種併發問題。事務1與事務2先後讀入同一資料A=16,事務1執行A-1,並將結果A=15寫回,事務2執行A-1,並將結果A=15寫回。事務2提交的結果覆蓋了事務1對資料庫的修改,從而使事務1對資料庫的修改丟失了。   

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

  (3)不可重複讀(nonrepeatable read) 
  一個事務重新讀取前面讀取過的資料,發現該資料已經被另一個已提交的事務修改過。即事務1讀取某一資料後,事務2對其做了修改,當事務1再次讀資料時,得到的與第一次不同的值。     

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

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

另可參考詳細例子介紹

http://blog.csdn.net/hanxuemin12345/article/details/21740699