數據庫事務并發調度之封鎖技術
什么是事務
事務是數據庫邏輯工作單位,是用戶定義的一組操作序 列。具有原子性、一致性、隔離性和持續性。原子性表示操作不可分割,要么都做,要么都不做。一致性表示數據庫從一個一致性狀態變換到另一個一致性狀態隔離 性表示事務執行過程中不被其它事務打擾持續性表示事務一旦提交,它對數據庫中數據的改變就應該是永久性的。
事務并發的問題
(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