當多個事務在數據庫中並發執行時,數據的一致性可能受到破壞。系統有必要控制各事務之間的相互作用,這是通過並發控制機制的多種機制中的一種來實現的。
避免事務"餓死",授權加鎖的條件:不存在在數據項Q上持有與M型鎖沖突的鎖的其他事務;不存在等待對數據項Q加鎖且先於Ti申請加鎖的事務。
常用的機制是各種封鎖協議,時間戳排序,有效性檢查,多版本機制。
封鎖協議是一組闡明了事務合適對數據庫中的數據項加鎖解鎖的規則。兩階段封鎖協議僅在一個事務未曾釋放任何數據項時允許該事務封鎖新數據項。該協議保證可串行性,但不能避免死鎖。在缺少有關數據項存取方式的信息是,兩階段封鎖協議對保證可串行化來說不僅是必要的而且是充分的。
樹形協議規則:1、Ti的首次加鎖可以對任何數據項進行。2、此后Ti對數據項Q加鎖的前提是Ti持有Q的父項上的鎖。3、對數據項解鎖可以隨時進行。4、數據項被Ti加鎖並解鎖后,Ti不能再對該數據項加鎖。
時間戳排序機制通過事先在每對事務之間選擇一個順序來保證可串行性。系統中的每個事務對應一個唯一的固定的時間戳。事務的時間戳決定了事務的可串行化順序。這樣,如果事務Ti的時間戳小於事務Tj時間戳,則該機制保證產生的調度等價於事務Ti出現在事務Tj之前的一個串行調度。該機制通過回滾違反該次序的事務來保證這一點。
Thomas寫規則:假設事務Ti發出write(Q)操作:
1、若TS(Ti)<R-timestamp(Q),則Ti產生的Q值是先前所需要的值,但系統已假定該值不會被產生。因此,write操作被拒絕,Ti回滾。
2、若TS(Ti)<W-timestamp(Q),則Ti試圖寫入的Q值已過時。因此,這個write操作可悲忽略。
3、其它情況是執行write操作,將W-timestamp(Q)視為TS(Ti)。
在大部分事務是只讀事務,這樣事務見沖突頻度較低的情形下,有效性檢查機制是一個適當的並發控制機制。系統中的每個事務對應一個唯一的固定的時間戳,串行性次序是由事務的時間戳決定的。在該機制中,事務不會被延遲。不過,事務要完成必須通過有效性檢查,如果事務未通過有效性檢查,則蓋世五回滾到初始狀態。
某些情況下把多個數據項聚為一組,將它們作為聚集數據項來處理效果可能更好,這就導致了多級粒度。小數據項嵌套於大數據項之中。這種層次結果可以圖形化地表示為樹。封鎖按從根結點到葉結點的順序進行,解鎖則按從葉結點到根結點的順序進行。
多版本並發控制機制基於每個事務寫數據項時為該數據項創建一個新版本。讀操作發出時,系統選擇其中的一個版本進行讀取。利用時間戳,並發控制機制保證確保可串行性的方式選取要讀取的版本。
多版本最常用的技術是時間戳。對於系統中的每個事務Ti,我們將一個靜態的唯一的時間戳與之關聯,即為TS(Ti)。對於每個數據項Q,有一個版本序列<Q1,Q2,…Qm>與之關聯。
防止死鎖的一種方法是使用搶占與事務回滾;另一種方法是死鎖檢測與恢復機制。系統處於死鎖狀態當且僅當等待圖中包含環。