一、事務的特性
事務的ACID特性:
• 原子性(Atomicity):事務中包括的諸操作要麼都做,要麼都不做
• 一致性(Consistency):事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態
• 隔離性(Isolation):一個事務內部的操作及使用的資料對其他並發事務是隔離的
• 持久性(Durability ):一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的
二、封鎖的並發控制技術
基本封鎖類型
– 排它鎖(eXclusive lock,簡記為X鎖)
– 共用鎖定(Share lock,簡記為S鎖)
三級封鎖協議:在不同程度上保證資料一致性
a)1級封鎖協議:事務T在修改資料R之前必須先對其加X鎖,直到事務結束才釋放.在1級封鎖協議中,如果是讀資料,不需
要加鎖的,所以它不能保證可重複讀和不讀“髒”資料。
b)2級封鎖協議:1級封鎖協議+事務T在讀取資料R前必須先加S鎖,讀完後即可釋放S鎖.在2級封鎖協議中,由於讀完資料後即可釋放S鎖,所以它不能保證可重複讀。
c)3級封鎖協議:1級封鎖協議+ 事務T在讀取資料R之前必須先對其加S鎖,直到事務結束才釋放.3級封鎖協議可防止丟失修改、讀髒資料和不可重複讀取。
兩段鎖協議:保證並發調度的正確性
兩段鎖協議的內容
– 1. 在對任何資料進行讀、寫操作之前,事務首先要獲得對該資料的封鎖
– 2. 在釋放一個封鎖之後,事務不再獲得任何其他封鎖。
“兩段”鎖的含義
– 事務分為兩個階段
• 第一階段是獲得封鎖,也稱為擴充階段;
• 第二階段是釋放封鎖,也稱為收縮階段。
如:Slock A ... Slock B ... Xlock C ...Unlock B ... Unlock A ... Unlock C;
兩段鎖協議補充:
• 並存執行的所有事務均遵守兩段鎖協議,則對這些事務的所有並行調度策略都是可序列化的。
• 所有遵守兩段鎖協議的事務,其並存執行的結果一定是正確的
• 事務遵守兩段鎖協議是可序列化調度的充分條件,而不是必要條件
• 可序列化的調度中,不一定所有事務都必須符合兩段鎖協議。
三、死結及解決方案
預防死結的方法:
1)一次封鎖法:要求每個事務必須一次將所有要使用的資料全部加鎖,否則就不能繼續執行。將以後要用到的全部資料加鎖,勢必擴大了封鎖的範圍,從而降低了系統的並發度。難於事先精確確定封鎖對象。
2)順序封鎖法:順序封鎖法是預先對資料對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
維護成本高,難於實現。
結論
– 在作業系統中廣為採用的預防死結的策略並不很適合資料庫的特點
– DBMS在解決死結的問題上更普遍採用的是診斷並解除死結的方法
死結的診斷與解除:
•允許死結發生
• 解除死結
– 由DBMS的並發控制子系統定期檢測系統中是否存在死結
– 一旦檢測到死結,就要設法解除
檢測死結:
a)逾時法:如果一個事務的等待時間超過了規定的時限,就認為發生了死結.
b)等待圖法:並發控制子系統周期性地(比如每隔1 min)檢測事務等待圖,如果發現圖中存在迴路,則表示系統中出現了死結。
解除死結:選擇一個處理死結代價最小的事務,將其撤消,釋放此事務持有的所有的鎖,使其它事務能繼續運行下去。