DBMS 的 Concurrency Control方法:Locking Methods


DBMD可以透過Lock Manager讓Transaction藉由Lock(上鎖),使指定的資料只能被其使用,當使用完畢後進行解鎖,才可供其他Transaction使用。透過各種上鎖的方式來進行Concurrency Control 叫作Locking Methods。因為Locking Methods是基於假設Transactions對資料的操作常常衝突,所以這樣使用的鎖也叫作pessimistic locking(悲觀鎖)。

Lock Granularity (上鎖粒度)

上鎖粒度由大到小可分為:

  1. Database Level
  2. Table Level
  3. Page Level
  4. Row Level
  5. Field Level

顧名思義,Database Level就是一個Transaction獨佔整個資料庫,Table Level是一個Transaction獨佔整個表,Field Level是獨佔某個列的某個屬性。Field Level的上鎖成本高,若與Row Level比較起來會選擇後者。Page Level 上鎖的是diskpage,也就是硬體中儲存資料的區塊,固定大小,一般是4K、8K或16K。大部分Locking Method的DBMS使用的是Page Level,也是由於Row Level的成本比其高(試想query範圍資料)。

鎖的類型

Binary

Binary Lock只有兩種狀態,上鎖及沒上鎖。上鎖後其他Transaction不論讀取或修改都不能使用被上鎖的資料。

Shared/Exclusive

當Transaction只讀取資料時,會上Shared Lock,此時其他Transactions若只讀取資料時,可以被允許。當Transaction需修改資料時,會上Exclusive Lock,此時其他Transactions都不能使用上鎖的資料。Shared Lock只能在沒有Exclusive Lock時上鎖,Exclusive Lock只能在沒有其他鎖存在時上鎖。

這種方式還是不能確保Transaction的Serializability,以及可能發生Deadlock(死鎖),也就是兩個Transactions互相等待對方釋放鎖。

Two-Phase Locking

Two-Phase Locking(2PL) 雖然無法避免死鎖,但可以確保Serializability。
2PL的兩階段分別為:

  1. Growing Phase: 逐步加上此Transaction需要的鎖,且不能解鎖。
  2. Shrinking Phase: 逐步釋放此Transaction上的鎖,且不能上鎖。

在兩個階段間Transaction才能操作及處理資料。這樣一來每個Transaction勢必都不互相影響其他Transaction的資料。

死鎖的控制方法

Deadlock Prevention

當Transaction要求新鎖且DBMS判斷很有可能發生死鎖時,rollback此Transaction並釋放其所有鎖,接下來再重新安排執行他。

Deadlock Detection

當DBMS偵測到死鎖時,將受害的Transaction rollback、釋放所有鎖並重新安排執行。

Deadlock Avoidance

當Transaction獲取所有的鎖時才能開始執行,減少rollback的成本,但會增加反應時間。

這三種機制有不同的好處及代價,DBMS可以視情況使用不同的機制,當死鎖容易發生時使用Deadlock Detection,當反應時間不是重點時可以使用Deadlock Avoidance。

dbms 

See also