並發控制概述
為保證事務的隔離性和一致性,DBMS需要對並發操作進行正確的調度
並發操作引起的數據庫不一致的現象:
丟失修改[ww]
兩個事務T1和T2讀同一個數據並修改,T2提交的結果破壞了T1提交的結果,導致T1的修改被丟失。如下圖:

不可重復讀[rw(r)]
(1)事務T1讀取某一數據后,事務T2對其做了修改,當事務T1再讀該數據時,得到與前一次不同的值。如下圖:

(2)事務T1按照一定條件從數據庫中讀取了某些數據記錄后,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄神秘的消逝了。
(3)事務T1按照一定條件從數據庫中讀取了某些數據記錄后,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄。
后兩種不可重復讀有時候稱為幻影現象
讀臟數據[wr]
讀臟數據是指事務T1修改某一數據,並將其寫回磁盤,事務T2讀取同一個數據后,T1由於某種原因被撤銷(T1回滾),這時T2讀到的數據與數據庫中的數據不一致,則T2讀到了臟數據。

封鎖
所謂封鎖就是事務T再對某個數據對象例如表、記錄等操作執行之前,先向系統發出請求,對其加鎖,加鎖之后事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其他事務不能更新此數據對象
排它鎖又稱寫鎖。若事務T對數據對象加上X鎖,則只允許T讀取和修改A,其他任何事務都不能對A加任何數據類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
共享鎖又稱讀鎖。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他任何事務只能再對A加S鎖,而不能再加X鎖,直到T釋放A上的S鎖。這就保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
讀鎖和寫鎖的關系(圖為封鎖類型的相容關系矩陣):

一級封鎖協議
在事務T在修改數據R之前必須現對其加X鎖,直到事務結束才釋放該鎖。
一級封鎖協議中,如果是讀數據,不需要加鎖,它不能保證可重復讀和不讀臟數據。

