兩階段鎖協議
在數據庫系統領域,並發控制機制主要有兩種,即鎖和多版本機制。
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相對,基於鎖的並發控制機制稱為悲觀鎖,因為它認為其他事務修改自己正在使用的數據項的概率很高,因此對數據項加鎖以阻塞其他事務的讀和寫。
