課程複習——數據庫系統概論(第4版 王珊 薩師煊 高等教育出版社)—— 第十一章 併發控制

在單處理機系統中,事務的並行執行實際上是並行事務的並行操作輪流交叉運行,這種並行執行方式稱爲交叉併發方式。

在多處理機系統中,每個處理機可以運行一個事務,多個處理機可以同時運行多個事務,實現多個失誤真正地併發運行,這種並行執行方式成爲同時併發方式。

併發控制機制是衡量一個數據庫管理系統性能的重要標誌之一。

併發控制概述

事務是併發控制的基本單位,保證事務ACID特性,是失誤處理的重要任務。保證失誤的個理性和一隻行,DBMS需要對併發操作進行正確調度。

併發操作帶來的數據不一致性主要包括丟失修改(兩個事務讀入同一數據並修改,一個提交的結果破壞了另一個提交的結果,導致前一個提交的結果的丟失)、不可重複讀(一個事務讀取數據後,另一個失誤對其讀取的內容執行更新操作(修改該數據,刪除其中部分記錄,出入新紀錄(後兩種成爲幻影現象)),當前一個再次讀取該數據後,得到的結果與上一次得到的結果不同)和讀“髒”數據(一個失誤修改某數據,並寫回磁盤,另一個事務讀取該數據後,前一個事務又因爲某原因撤銷該操作,導致後一個事務讀出的內容與數據庫內容不一致)等。

產生上述數據不一致性的主要原因是併發操作破壞了事務的隔離性。

而數據庫的應用有時允許某些不一致性。例如統計工作中,個別髒數據對統計精度影響不大。

併發控制的主要技術有:封鎖(Locking)、時間戳(Timestamp)和樂觀控制法,商用的DBMS一般都採用封鎖方法。

封鎖

封鎖是實現併發控制的一個非常重要的技術。基本封鎖類型有:排它鎖(Exculsive Locks,簡稱X鎖)和共享鎖(Share Locks,簡稱S鎖)。

事務對某數據對象加X鎖後,不允許其他事務對該數據對象加任何對象的鎖。事務對某數據對象加S鎖,允許其他事務對該數據對象加S鎖,不允許任何事務對其加X鎖。

在實際運用中,當你要對某數據對象修改時,要對其加X鎖,只讀而不修改時加S鎖。

活鎖和死鎖

活鎖

當多個事務請求封鎖同一數據對象時,封鎖子系統對請求封鎖的事務的響應策略導致某一事物一直等待,這稱爲活鎖。

避免活鎖的簡單方法是採用先來先服的策略。封鎖子系統按照請求封鎖的先後次序對事務排隊,數據對象上的鎖一旦釋放就按照批准申請隊列中第一個事務獲得鎖。

死鎖

一個事務等待另一個事務封鎖了的數據對象,而那個事務也在等待這個事務封鎖的數據對象,這種現象稱爲死鎖。

數據庫中解決死鎖問題主要有兩種方法:1.預防。2.定期診斷,並解決。

1.死鎖的預防

(1)一次性封鎖法(每個事務一次將所有要使用的數據全部加鎖)。問題:1.降低系統的併發度;2.很難精確地確定每個事務所要封鎖的數據對象,從而擴大封鎖範圍,進一步降低併發度。

(2)順序封鎖法(預先對數據對象規定一個封鎖順序,所有的事務都按照這個順序實行封鎖)。問題:1.維護封鎖順序困難,成本高;2.很難去確定每個事務要封鎖哪些對象。

DBMS採用的是診斷並解除死鎖的方法。

2.死鎖的診斷與解除

診斷:超時法或事務等待圖法。

(1)超時法(如果某一事務的等待時間超過了規定的實現,就認爲發生了死鎖)。問題:1.可能誤判;2.時限太長無法及時發現。

(2)事務等待圖法(併發控制子系統週期性地生成事務等待圖,如果事務等待圖中存在迴路,則表示出現了死鎖)。
解除:選擇一個處理死鎖代價最小的事務,將其撤銷,釋放該事務持有的所有的鎖,撤銷該是無所執行的數據修改。

11.4  併發調度的可串行性

11.4.1 可串行化調度

定義:多個事務的併發執行是正確的,當且僅當期結果與按某一次序串行地執行這些事務時的結果相同,成這高中調度策略爲可串行化的調度。

可串行性(Serializability)是併發事務正確調度的標準。按照這個準則規定,一個給定的併發調度,當且僅當他是可串行化的,才認爲是正確調度。

11.4.2 衝突可串行化調度

定義:衝突操作是指餘的事務對同一個數據的讀寫操作和寫寫操作:Ri(x)與Wj(x)和Ri(x)與Wj(x);

其他操作是不衝突操作。

不同是無的衝突操作和同一事務的兩個操作是不能交換(swap)的。

一個調度Sc在保證衝突操作的次序不變的情況下,通過交換兩個事務不衝突操作的次序得到另一個調度Sc‘,如果Sc'是串行的,成調度Sc爲衝突可串行化的調度。一個調度是衝突可串行化,一定是可串行化的調度,反之不一定。

11.5 兩段鎖協議

目前DBMS普遍採用兩段鎖(Tow-Phase Locking,簡稱2PL)洗衣的方法實現併發調度的可串行性,從而保證調度的正確性。

定義:在運用封鎖方法是,對數據對象加鎖需要約定一些規則,例如何時申請封鎖、持鎖時間、可是釋放封鎖等。這些規則成爲封鎖協議。

兩段鎖協議是常用的一種封鎖協議,理論上已經證明使用兩段鎖協議產生的是可串行化調度。

定義:兩段鎖協議:所有事務必須分爲兩個階段對數據項加鎖和解鎖,在對任何數據進行讀和寫操作之前,首先要申請並獲得對該數據的封鎖,在釋放一個封鎖後,事務不再申請和或等任何其他封鎖。

事務遵守兩段鎖協議時間可串行化調度的充分條件,不是必要條件。

兩段鎖協議和防止死鎖的一次封鎖發的異同之處:一次封鎖要求每個事務必須一次價格所有要使用的數據全部加鎖,否則就不能繼續執行。因此一次封鎖法遵守兩段鎖協議;但是兩段鎖協議並不要求是必須一次將所有要使用的數據全部加鎖,因此遵守兩端說協議的事務有可能發生死鎖。如圖:p302

11。6 封鎖的粒度

定義:封鎖對象的大小稱爲封鎖粒度(Granularity)。封鎖對象可以是邏輯單元,也可以是物理單元。

封鎖粒度與系統的併發度和併發控制的開銷密切相關。封鎖粒度越大,數據庫所能封鎖的數據單元就越少,併發度就越小,系統開銷也越小;反之也成立。

一個系統中同時支持多種封鎖粒度共不同的事務選擇是比較理想的,這種封鎖方法成爲多粒度封鎖(Multiple Granularity Locking)。一般來說,需要處理大量遠足的事務可以以關係爲封鎖粒度;需要處理多個關係的大量遠足的事務可以以數據庫爲封鎖粒度;而對於一個處理少量怨毒的用戶事務,以元祖爲封鎖粒度比較何止了。

11.6.1 多粒度封鎖

多粒度數的根節點是整個數據庫,表示最大的數據粒度。也家電標誌最小的數據粒度。

多粒度封鎖協議允許多粒度數中的每個節點被獨立地加鎖。對一個節點加鎖意味着這個節點的所有後裔結點也被加以同樣類型的鎖。

顯式封鎖是應事務的要求直接加到數據對象上的封鎖;

隱式封鎖是該數據對象美譽獨立加鎖,是由於其上級結點加鎖而使該數據對象加上了鎖。

系統檢查封鎖衝突時不僅要檢查顯式封鎖還要檢查隱式封鎖(他們的效果一樣)。導致效率低下。

DBMS使用意向鎖(Intent Lock)避免諸葛檢查下一級結點的顯示封鎖。

11.6.2 意向鎖

定義:如果對一個結點加意向鎖,則說明該結點的下層節點正在被加鎖;對任意節點加鎖是,必須對他的上層結點加意向鎖。

三種常用的意向鎖:意向共享鎖(Intent Share Lock, 簡稱IS);意向排它鎖(Intent ExclusiveLock,簡稱IX);共享意向鎖(Share Intent Exclusive Lock,簡稱SIX);

SIX表示該事務要讀整個表(所以對該表加S鎖),同時會更新個別元組(所以對該表加IX鎖);SIX=S+IX;

11.7 小結

數據庫的重要特徵是它能爲多個用戶提供數據共享。數據庫管理系統允許共享的用戶數目是數據庫管理系統重要標誌之一。數據庫管理系統必須提供併發控制機制來協調併發用戶的併發操作以保證併發事務的隔離性和一致性,保證數據庫的一致性。

兩段鎖協議可以保證事務調度的正確性。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章