回滾機制 05 基於封鎖的併發控制機制

2021-10-25 13:03:41 字數 2055 閱讀 6159

死鎖:兩個或兩個以上事務處於等待狀態,每個事務都在等待其中另乙個事務釋放資源,導致所有事務都無法執行,這種現象稱為死鎖。

處理死鎖的方法:

(一)引入死鎖預防協議,使系統不進入死鎖狀態:通過對加鎖請求進行排序,一事務開始前要鎖定所有的資料項

(二)允許系統進入死鎖狀態,引入死鎖檢測和死鎖恢復機制進行恢復。比如說定時檢測下有沒死鎖

死鎖的預防:

(一)搶占與事務回滾技術 :基本措施:每乙個事務賦予乙個時間戳,若乙個事物回滾,則當重啟該事務時,必須保持原時間戳,然後採用以下機制:

wait-die:如果t1申請的資料被t2持有時,則只有t1>t2時,t1等待,否則回滾

wound-wait與前面條件相同時,只有:t1(二)基於超時的機制:事先給出事務的等待時間,超時即回滾

一般的資料庫是採用死鎖檢測而不是死鎖預防

t1->t3,指的是t1持有等待t3釋放資料項的鎖,如果這個圖沒有環就說明沒有進入死鎖

有環,死鎖,打破這個環即可,在環上選擇一些事務進行回滾,選擇代價最小的事務,但如果每次都選擇乙個事務回滾,可能會出現餓死現象,可以把回滾次數考慮進去,賦予優先許可權,以防止某些事務老是被回滾不被執行

基於鎖協議的開銷較大,併發效率不是特別高

怎樣才能對事務進行正確的加鎖呢?這裡給出兩段鎖協議,該協議如下:

所有事務分兩個階段提出加鎖和解鎖請求:

1.增長階段:事務可以獲得鎖,但不能解鎖

2.縮減階段:事務解鎖,但不能獲得鎖

開始->加鎖點,事務只能獲得所不能解鎖;加鎖點->結束,事務只能解鎖不能獲得鎖

這樣就不會出現我們講的第乙個不正確加鎖導致錯誤的情況出現,遵循了兩階段鎖協議的併發控制演算法所產生的排程是衝突可序列化排程,即解決了第乙個問題,但仍然存在死鎖現象,級聯回滾可能發生

t1故障,t2,t3也會回滾

如何避免級聯回滾?(把鎖協議進行嚴格化)

嚴格化鎖協議:我們要求事務持有的排他鎖(x鎖),必須在事務提交之後才可以釋放,這時我們就解決了級聯回滾的問題,這樣的話t1提交t2才能修改,t2提交t3才能修改。

這樣我們就通過嚴格兩階段鎖協議來避免級聯回滾這個問題

強兩階段鎖協議:要求事務提交之前不得釋放任何鎖,這樣就要求兩個事務如果在某個階段共享某乙個資料資源的話,那麼乙個事務必須等待另乙個事務完成了再執行,因為在某個時段內是序列的所以並行程度低

大部分資料庫系統採用嚴格兩階段鎖協議或加強兩階段鎖協議。但這兩種協議並行程式較低,有時為提高並行能力,採用鎖轉換機制,在寫的時候將s鎖轉換成x鎖,寫完後再降為s鎖。

3.多粒度鎖及意向鎖

多粒度加鎖的特點:

顯示加鎖:樹上每個結點都可以單獨加鎖

隱式加鎖:對當前結點加鎖會導致隱式地對全部後代結點加上同型別的鎖

檢查鎖衝突時,必須檢查祖先、後代結點。

對鎖型別進行擴充:意向鎖:乙個事務對乙個資料物件顯示加鎖之前,必須對它的全部祖先結點加意向鎖。

如果乙個結點上有意向鎖,則它的後代結點必有被顯示加鎖。

可序列性多粒度鎖協議:

多粒度鎖協議在由如下事務型別混合而成的應用中有用:

4.死鎖的處理

死鎖:兩個或兩個以上事務處於等待狀態,每個事務都在等待其中另乙個事務釋放資源,導致所有事務都無法執行。這種現象稱為死鎖。

處理死鎖的方法:

死鎖的預防:

基於超時的機制:事先給出事務的等待的時間,超時即回滾

併發控制的主要技術 封鎖

上篇部落格通過一些例項介紹了併發導致的資料不一致一系列問題 丟失修改 讀髒資料 不可重複讀 併發操作與資料的不一致性 本篇部落格介紹如何進行併發控制。封鎖。1 封鎖就是事務 t在對某資料物件 例如 表 記錄 操作之前,先向系統發出請求,對其加鎖 2 加鎖後事務 t就對資料物件有了一定的控制,在事務 ...

併發控制的主要技術 封鎖

上篇部落格通過一些例項介紹了併發導致的資料不一致一系列問題 丟失修改 讀髒資料 不可重複讀 本篇部落格介紹如何進行併發控制。封鎖。1 封鎖就是事務 t在對某資料物件 例如 表 記錄 操作之前,先向系統發出請求,對其加鎖 2 加鎖後事務 t就對資料物件有了一定的控制,在事務 t釋放它的鎖之前,其他的事...

oracle的回滾和撤銷機制

為了保證資料庫中多個使用者間的讀一致性和能夠回退事務。一 在乙個簡單的更新語句中,對於回滾段的操作存在多處,在事務開始時,首 先需要在回滾表空間獲得乙個事務槽,分配空間,然後建立前映象,此後事務的 修改才能進行,oracle必須以此來保證事務是可以回滾的。如果使用者提交了事務 oracle會在日誌檔...