wom知道事務的ACID特性被破壞的原因之一就是多個事務對數據庫的併發操作造成的。所以 數據庫管理系統需要對這些併發操作進行正確的調度,併發控制機制就是用正確的方式調度併發操作,使一個用戶事務不收其他事務的干擾。
併發控制的技術主要有封鎖,時間戳,樂觀控制發和多版本併發控制等
1. 封鎖
基本的封鎖類型有:排他鎖(X鎖,寫鎖)和共享鎖(S鎖,讀鎖)
數據庫中的共享鎖和排他鎖:https://blog.csdn.net/qq_41386300/article/details/101937234
1.1 封鎖協議
封鎖協議:何時申請鎖,持鎖時間,何時釋放
-
一級封鎖協議
事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放
只能避免事務的丟失更新 -
二級封鎖協議
在一級的基礎上增加:事務T在讀取數據R之前必須加S鎖,,讀完後釋放
進一步避免了髒讀 -
三級封鎖協議
一級的基礎是上增加:事務T在讀取數據R之前必須加S鎖,,事務結束後釋放
進一步避免了不可重複讀
1.2 活鎖和死鎖
活鎖
如果事務T1封鎖裏數據R,事務T2也請求封鎖R,T2等待,事務T3也請求封鎖R,當T1釋放裏R的鎖後,系統首先批准了T3的請求,T2繼續等待,然後T4又請求封鎖R,T3釋放鎖後系統又批准裏T4的請求…T2有可能永遠等待,這就是活鎖的情形
避免活鎖的簡單方法是採用先來先服務策略
死鎖
死鎖就是循環等待的情形
數據庫中解決死鎖問題主要有兩類辦法:一是採取一定措施預防死鎖的發生;二是定期診斷是否有死鎖,有則解除它
- 死鎖預防
- 一次封鎖法
每個事務都一次性將所有要使用的數據全部加鎖 - 順序封鎖法
預先對數據對象規定一個封鎖順序,所有事務都按這個順序實施封鎖
- 一次封鎖法
數據庫中普遍採用診斷並解除的方法
- 死鎖診斷與解除
- 死鎖診斷
- 超時法
如果一個事務等待時間超過了規定的時間,就認爲發生裏死鎖
缺點:一是有可能誤判;二是若時間設置太長,死鎖發生後不能及時發現 - 等待圖法
事務等待圖是一個有向圖G=(T,U),T爲結點集合,u爲邊集合,若事務T1等待T2,則畫一條由T1指向T2的邊
併發控制子系統週期性的生成事務等待圖,並進行檢測,如果發現圖中存在迴路,則表示系統中出現裏死鎖
- 超時法
- 死鎖解除
通常採用的方法是選擇一個處理死鎖代價最小的事務,將其撤銷,釋放此事務持有的所有鎖,當然,對撤銷的事務所做的數據修改操作必須恢復
- 死鎖診斷
2. 時間戳
給每一個事務蓋上一個時標,即事務開始執行的時間,每個事務具有唯一的時間戳,如果發生衝突操作,就回滾具有較早時間戳的事務,以保證其他事務的正常執行,被回滾的事務被賦予一個新的時間戳並從頭開始執行
3. 樂觀控制法
樂觀控制法認爲很少發生衝突,一次不對事務進行特殊的管制,而是讓他自由執行,事務提交前再進行正確性檢查,如果檢查後發現該事務出現過沖突,則拒絕執行並回滾
4. 多版本併發控制
版本是指數據對象的一個快照,記錄數據對象某個時刻的爲狀態。
有一個數據對象A有兩個事務,T1是寫事務,T2是讀事務,先啓動T1後啓動T2,T1在寫A時,爲A生成一個新的版本A‘,那麼T2就可以繼續在T1上執行,,T2提交的時候要先檢查T1是否完成,如果T1已完成則T2可以提交,否則T2等待直到T1完成。