兩階段鎖協議

兩階段鎖協議
 
在數據庫系統領域,併發控制機制主要有兩種,即鎖和多版本機制。
 
1.事務在加鎖時有多種方式:
 
一次性鎖協議,事務開始時,即一次性申請全部的鎖,以後不會再申請任何鎖,若是其中某個鎖不可用,則整個申請就不成功,事務就不會執行,在事務尾端,一次性釋放全部的鎖。一次性鎖協議不會產生死鎖的問題,但事務的併發度不高。
 
兩階段鎖協議,整個事務分爲兩個階段,前一個階段爲加鎖,後一個階段爲解鎖。在加鎖階段,事務只能加鎖,也能夠操做數據,但不能解鎖,直到事務釋放第一個鎖,就進入解鎖階段,此過程當中事務只能解鎖,也能夠操做數據,不能再加鎖。兩階段鎖協議使得事務具備較高的併發度,由於解鎖沒必要發生在事務結尾。它的不足是沒有解決死鎖的問題,由於它在加鎖階段沒有順序要求。如兩個事務分別申請了A, B鎖,接着又申請對方的鎖,此時進入死鎖狀態。
 
樹形協議,假設數據項的集合知足一個偏序關係,訪問數據項必須按此偏序關係的前後進行。如di->dj,則要想訪問dj,必須先訪問di。這種偏序關係導出一個有向無環圖(DAG),所以稱爲樹形協議。樹形協議的規則有:
樹形協議只有獨佔鎖;
事務T第一次加鎖能夠對任何數據項進行;
此後,事務T對數據項Q的加鎖前提是持有Q的父親數據項的鎖;
對數據項的解鎖能夠隨時進行;
數據項被事務T加鎖並解鎖以後,就不能再被事務T加鎖。
樹形協議的優勢是併發度好,由於能夠較早地解鎖。而且沒有死鎖,由於其加鎖都是順序進行的。
缺點是對不須要訪問的數據進行沒必要要的加鎖。
 
時間戳排序協議,每一個事務都有一個惟一的時間戳,也就是其進入系統的時間。時間戳有大小之分,若是事務Ti比Tj先進入系統,則TS(Ti)<TS(Tj)。對於每一個數據項Q,有兩個時間戳與其綁定:一個是W-TS(Q),表示最近一次寫數據項Q的事務的時間戳;一個是R-TS(Q),表示最近一次讀數據項Q的事務的時間戳。Thomas協議是對時間戳排序協議的改進,具體內容以下:
若事務Ti發起一個write(Q),則
若是TS(Ti)<R-TS(Q),則代表Ti準備寫的值還沒來得及寫入,Q就提早被讀取了,因此Ti的write(Q)操做被拒絕,而且事務Ti被回滾。
若是TS(Ti)<W-TS(Q),代表Ti寫的值已過時,比它更新的值已經寫到Q上,因此Ti的write(Q)操做被拒絕。
剩下的狀況,write(Q)操做被容許。
 
事務在加鎖時存在粒度的區別
如數據庫鎖,表鎖,行鎖,字段鎖;頁鎖等。不一樣的數據庫支持的鎖粒度不一樣,BerkeleyDB支持頁鎖,即對數據項所在的內存頁加鎖。
 
 
2.多版本機制
鎖是針對集中式數據管理設計的,缺點是下降了事務的併發,而且鎖自己有開銷。在分佈式系統,尤爲是讀多寫少的系統中,採用多版本機制更合適。每一個數據項都有多個副本,每一個副本都有一個時間戳,根據多版本併發控制協議(MVCC)維護各個版本。
 
MVCC又稱爲樂觀鎖,它在讀取數據項時,不加鎖;在更新數據項時,直到最後要提交時,纔會加鎖。這與CAS(Compare and Swap)的機制很相似,爲了提升併發度,它更新數據前,會將數據拷貝一份,進行一系列修改,而且拷貝的同時,會記錄當前的版本號(時間戳),當修改完畢,即將提交時,再檢查此時的版本號是否與剛纔記錄的一致,若是不一致,則代表數據項被其餘事務修改,當前事務的修改被取消。不然,正式提交修改,並增長版本號。
與MVCC相對,基於鎖的併發控制機制稱爲悲觀鎖,由於它認爲其餘事務修改本身正在使用的數據項的機率很高,所以對數據項加鎖以阻塞其餘事務的讀和寫。
相關文章
相關標籤/搜索