1. 程式人生 > >資料庫系統概論:第十一章 併發控制

資料庫系統概論:第十一章 併發控制

事務可以一個一個地序列執行,即每一個時刻只有一個事務正在執行,其他事務必須等迭代這個事務結束才能執行。

在單處理機中,事務的併發執行實際上是這些並行事務的並行操作輪流交叉執行。雖然單處理機系統中的並行事務並沒有真正地並行,但是減少了處理機的空閒時間,提高了系統地效率。

在這裡插入圖片描述

11.1 併發控制概述

事務是併發控制的基本單位

併發控制的目的:保證事務的隔離性和一致性

併發操作帶來的資料不一致性:

  1. 丟失修改:讀入同一資料並修改
  2. 不可重複讀:讀第一次和讀第二次的結果不一樣,因為別人在中間修改插入刪除了某些資料
  3. 讀“髒”資料:T1修改某一資料並寫回,T2讀取,T1撤銷操作,T2的資料便是髒資料

原因:併發操作破壞了事務的隔離性

併發控制機制就是要用正確的方式排程併發操作,使一個使用者事務的執行不受其他事務的干擾

併發控制的主要技術:

  1. 封鎖:銀行、證券
  2. 時間戳
  3. 樂觀控制法
  4. 多版本併發控制

封鎖是一種悲觀的技術,認為衝突總在發生,因此控制併發事務。23是樂觀的技術,認為衝突不常發生,如果衝突再回滾。

11.2 封鎖

基本封鎖型別:

  • 排他鎖 (X鎖):寫鎖

    若事務T對資料物件A加上了X鎖,則只允許T讀取和修改A,其他任何事務都不能再對A加任何型別的鎖,直到T釋放A上的鎖為止。這就保證了其他事務在T釋放A上的鎖之前不能讀取和修改A。

  • 共享鎖 (S鎖):讀鎖

    若事務T對資料物件加上了S鎖,則事務T可以讀取A但不能修改A。其他事務也只能再對A新增S鎖,而不能加X鎖,知道T釋放A上的S鎖為止。

11.3 封鎖協議

  1. 一級封鎖協議:事務T在修改資料R前必須先對其加X鎖,直到事務結束才釋放。

    只能保證不發生丟失修改。

  2. 二級封鎖協議:在一級封鎖協議基礎上,增加事務T在讀取資料R前必須先對其加S鎖,讀完後即可釋放S鎖。

    保證了不發生讀“髒”資料和不發生丟失修改

  3. 三級封鎖協議:在一級封鎖協議的基礎上,增加事務T在讀取資料R前必須先對其加S鎖,直到事務結束才釋放

    進一步防止了不可重複讀。保證了不發生讀“髒”資料和不發生丟失修改以及不可重複讀。

封鎖協議級別越高,一致性程度越高

在這裡插入圖片描述

11.4 活鎖和死鎖

11.4.1 活鎖

事務T2永遠等待,這就是活鎖的情形。

在這裡插入圖片描述

避免活鎖的簡單方法是採用先來先服務的策略。

11.4.2 死鎖

1. 死鎖的預防

  1. 一次封鎖法:每個事務必須一次將所有要使用的資料全部加鎖。
    缺點:降低了系統的併發度。而且資料是不斷變化的,很難事先精確確定每個事務所要封鎖的資料物件。

  2. 順序封鎖法:預先對資料物件規定一個封鎖順序,所有事務都按這個順序實現封鎖。

缺點:封鎖的資料物件極多且在不斷變化。事務的封鎖請求隨著事務的執行而動態地決定,很難事先確定。

預防死鎖的策略適合作業系統,不太適合資料庫,更多使用診斷並解除死鎖的方法

2.死鎖的診斷與解除

  1. 超時法:實現簡單,用得最多
    缺點:可能誤判。若時限太長不能及時發現
  2. 等待圖法:精確判斷死鎖

在這裡插入圖片描述

解除死鎖的方法:選擇一個處理死鎖代價最小的事務,將其撤銷,釋放此事務持有的所有的鎖,使其他事務得以繼續執行下去。但實際上是很難的,通常隨便選定一個回滾,因為代價很難判斷。

11.5 併發排程的可序列性

11.5.1 可序列化排程

定義:多個事務的併發執行是正確的,當且僅當其結果與按某一次序序列地執行這些事務時的結果相同,稱這種排程策略為可序列化排程。

可序列性(serializability)是併發事務正確排程的準則

11.5.2 衝突可序列化排程

衝突操作:不同的事務對同一個資料的讀寫操作和寫寫操作

不同事務的衝突操作和同一事務的兩個操作是不能交換的

一個排程Sc在保證衝突操作的次序不變的情況下,通過交換兩個事務不衝突操作的次序得到另一個排程Sc’,如果Sc’是序列的,排程Sc為衝突可序列化的排程。若一個排程是衝突可序列化,則一定是可序列化的排程。(充分不必要條件)

在實際系統中,通常用優先圖。一個事務對應一個節點,兩個事務間有有向邊(Ti->Tj)當且僅當Ti在Tj前執行,意味著他們之間有衝突不能交換。圖沒有環意味著衝突可序列化。

11.6 兩段鎖協議

定義:所有事務必須分兩個階段對資料項進行加鎖和解鎖

所謂兩端鎖協議是指所有的事務必須分為兩個階段對資料項進行加鎖和解鎖:

  • 在對任何資料進行讀寫操作之前,首先要申請並獲得對該資料的封鎖
  • 在釋放一個封鎖之後,事務不再申請和獲得任何其他封鎖

事務分為兩個階段:

  1. 獲得封鎖,也稱為擴充套件階段,可以申請獲得任何資料項上的任何型別的鎖,不能釋放任何鎖
  2. 釋放封鎖,也稱為收縮階段,可以釋放任何鎖,但是不能申請任何鎖

可以證明,若併發執行的所有事務均遵守兩段鎖協議,則對這些事務的任何併發排程策略都是可序列化的(充分不必要條件),但是可能導致死鎖

11.7 封鎖的粒度

封鎖粒度:封鎖物件的大小,包括邏輯單元(屬性值、關係……)和物理單元(頁、物理記錄……)

封鎖粒度與系統的併發度和併發控制的開銷密切相關

  • 粒度大,開銷小,併發度小
  • 粒度小,開銷大,併發度大

11.7.1 多粒度封鎖

多粒度樹:根是整個資料庫,表示最大的資料粒度,葉節點表示最小的資料粒度

多粒度封鎖協議:對一個結點加鎖意味著這個結點的所有後代結點也被加以相同型別的鎖

在這裡插入圖片描述

  • 顯式封鎖:應事務的要求直接加到資料物件上的鎖
  • 隱式封鎖:該資料物件沒有被獨立加鎖,是由於其上級結點加鎖而使該資料物件加上了鎖

加鎖過程:對R1加X鎖,需要搜尋其上級結點資料庫、R1本身和R1的下級結點,如果其中某一個數據物件已經加了不相容鎖,則必須等待。開銷太大,解決方法是意向鎖

11.7.2 意向鎖

意向鎖:如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層加意向鎖

意向鎖:

  1. 意向共享鎖(IS鎖):表示它的後代結點擬加X鎖
  2. 意向排他鎖(IX鎖)
  3. 共享意向排他鎖(SIX鎖):對它加S鎖,再加IX鎖

在這裡插入圖片描述

加鎖方法:從根開始對它的上層結點加意向鎖,再對資料物件加鎖。釋放封鎖則自下而上地進行

優點:提高了系統的併發度,減少了加鎖和解鎖的開銷。