數據庫事務并發調度之封鎖技術

jopen 12年前發布 | 27K 次閱讀 事務

什么是事務


               事務是數據庫邏輯工作單位,是用戶定義的一組操作序 列。具有原子性、一致性、隔離性和持續性。原子性表示操作不可分割,要么都做,要么都不做。一致性表示數據庫從一個一致性狀態變換到另一個一致性狀態隔離 性表示事務執行過程中不被其它事務打擾持續性表示事務一旦提交,它對數據庫中數據的改變就應該是永久性的。


事務并發的問題


(1)      丟失修改,當事務1在t1時刻讀取A=16,事務2在t2時刻讀取A=16,在t3時刻事務1修改A=A-1;寫回數據庫A=15。在t4時刻事務2更新A=A-1,寫回數據庫A=15。這樣導致了事務1的修改丟失。如下圖:

數據庫事務并發調度之封鎖技術

(2)      不可重復讀,當事務1在t1時刻讀取A=50,讀取B=100,求和=150,事務2在t2時刻更新B=100,修改B=B*2,寫回B=200,在t3時刻事務1讀取值校對重讀B,發現B變為200與第一次讀取不一致,如下圖:

數據庫事務并發調度之封鎖技術

(3)      臟讀,事務1在t1時刻讀取C=100,更新C=C*2寫回數據庫C=200,事務2在t2時刻讀取C=200,在t3時刻事務1執行了更新C的回滾操作,C=100,那么此時就導致事務2讀取的C為臟數據。如下圖:

數據庫事務并發調度之封鎖技術

產生以上問題的原因:由于事務的并發破壞了事務的隔離性,導致各個事務并發出現干擾,要想是事務能達到隔離特性,就需要串行調度,也就是某一時刻只能有一個事務完成,其它事務等待。

 

封鎖解決并發問題


封鎖:是事務T在對某個數據操作時,例如,對表、記錄等操作之前,先向系統發出請求,對其加鎖,加鎖后事務T就對該數據擁有了一定的控制,在事務T沒有釋放它的鎖之前,其它事務不能更新該數據

封鎖類型:排它鎖(exclusive lock)也成為X鎖,共享鎖(share lock)也成為S鎖。其關系為:對數據加X鎖后,其它事務不能加任何鎖,對數據加S鎖后,其它事務可以加S鎖,但不能加X鎖。

采用三級封鎖協議解決事務并發產生的問題:

(1)      一級封鎖協議,解決修改丟失問題。描述如下:當事務T在修改數據R之前必須先對其加X鎖,直到事務結束。如圖:

數據庫事務并發調度之封鎖技術

事務1在讀取A進行修改之前先對A加X鎖,當事務2再請求對A加X鎖時被拒絕,只能等待事務1釋放A上的鎖。

(2)      二級封鎖協議,解決修改丟失和臟讀問題。描述如下:在一級封鎖協議基礎上,當事務讀取數據R之前必須先對其加S鎖,讀完后釋放S鎖。如圖:

數據庫事務并發調度之封鎖技術

事務1在對C修改之前先加X鎖,修改后寫回磁盤,事務2請求數據C,首先請求在C上加S鎖,因為事務1加了S鎖,事務2只能等待事務1釋放X鎖,當事務1由于某種原因回滾C=100,釋放X鎖后,事務2獲取S鎖,讀取C=100,避免了臟讀。

(3)      三級封鎖協議,解決修改丟失,臟讀,不可重復讀。描述如下:在一級封鎖協議基礎上,當事務讀取數據R時必須先加S鎖,當整個事務讀取結束后釋放S鎖。如下圖:

數據庫事務并發調度之封鎖技術

事務1在讀取A,B之前,先對A,B加S鎖,這樣當其它事務只能對A,B加S鎖,而不 能加X鎖,因此其它事務只能查詢而不能修改A,B。所以當事務2修改B申請為其加X鎖時被拒絕,只能等待事務1釋放S鎖。由于事務1沒有結束因此S鎖被占 用,事務2等待,此時當事務1再次校驗B時,讀取B=100,避免了不可重復讀。

來自:http://blog.csdn.net/lb85858585/article/details/8042541

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!