兩段鎖協議

兩段鎖協議

兩段鎖協議是指每個事務的執行可以分為兩個階段:生長階段(加鎖階段)和衰退階段(解鎖階段)。

術語介紹


概念
加鎖階段:在該階段可以進行加鎖操作。在對任何數據進行讀操作之前要申請並獲得S鎖,在進行寫操作之前要申請並獲得X鎖。加鎖不成功,則事務進入等待狀態,直到加鎖成功才繼續執行。
解鎖階段:當事務釋放了一個封鎖以後,事務進入解鎖階段,在該階段只能進行解鎖操作不能再進行加鎖操作。
兩段封鎖法可以這樣來實現:事務開始后就處於加鎖階段,一直到執行ROLLBACKCOMMIT之前都是加鎖階段。ROLLBACK和COMMIT使事務進入解鎖階段,即在ROLLBACK和COMMIT模塊中DBMS釋放所有封鎖。
封鎖序列
封鎖序列
兩段鎖協議是指所有事務必須分兩個階段對數據項加鎖和解鎖:
1. 在對任何數據進行讀、寫操作之前,要申請並獲得對該數據的封鎖。
2. 每個事務中,所有的封鎖請求先於所有的解鎖請求。
例如事務T1遵守兩段鎖協議,其封鎖序列是:
Lock A, Read A, A:=A+100, Write A, Lock B, Unlock A, Read B, Unlock B, Commit;
可以證明,若併發執行的所有事務均遵守兩段鎖協議,則對這些事務的任何併發調度策略都是可串列化的。
另外要注意兩段鎖協議和防止死鎖的一次封鎖法的異同之處。一次封鎖法要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行,因此一次封鎖法遵守兩段鎖協議;但是兩段鎖協議並不要求事務必須一次將所有要使用的數據全部加鎖,因此遵守兩段鎖協議的事務可能發生死鎖