亞信科技AntDB資料庫——深入瞭解AntDB-M後設資料鎖的實現(一)

亞信AntDB資料庫發表於2023-12-14

鎖的獲取  


5.1 鎖的強弱

當執行緒已經持有的鎖比新申請的鎖更強時,認為已經持有了鎖,無需再對申請鎖型別加鎖。鎖的強弱指持有的鎖與其他鎖的不相容集合大小,集合相同鎖相同,集合更大鎖更強,否則無強弱關係。透過鎖的相容點陣圖進行簡單的 位運算 即可快速判斷鎖的強弱。


5.2 兩種鎖範圍

按照鎖的適用範圍將鎖劃分為兩類,當然劃分不是非此即彼的,會有重疊,這兩類鎖有各自的相容性和鎖物件管理方式。


  ●範圍鎖( scoped locks)

只有三種鎖(IX,S,X),主要用於GLOBAL、COMMIT、TABLESPACE、BACKUP_LOCK名稱空間的物件。這幾種名稱空間的鎖主要從整體上去限制併發操作,比如在DML訪問一張表時,會先申請一個該表所屬SCHEMA的IX鎖,避免訪問過程中該SCHEMA被修改、刪除。範圍鎖全域性每種名稱空間都僅有一個鎖物件,從而實現全域性性的 併發控制


  ● 物件鎖   (per-object locks)

除了IX鎖,其他型別都可以用於其他名稱空間,這部分是最常用的鎖型別。主要用於對資料庫的某個具體後設資料的併發控制。這類鎖物件會比較多,對其有獨特的管理,本文不再展開說明。


5.3 兩種鎖型別

根據鎖的相容性、以及通用性將鎖分為兩類。


5.3.1互不干擾型(unobtrusive)

unobtrusive鎖相互間相容,並且適用於所有DML操作。這類鎖獲取後不用記錄下具體哪個執行緒申請的,只需要記錄下有多少個請求已經獲得,透過鎖物件下64位 原子變數 來計數,因此對其他連線的鎖申請影響很小,表現比較低調。在64位中每種型別鎖都有由固定的位範圍存放加鎖個數。對於scoped與per-object是不同鎖物件,因此位分別設定。

scoped locks:   IX(0~59位)

per-object locks:  S,SH(0~19位),SR(20~39位), SW(40~59位)

注意分配20位的不會產生溢位,因為當前設計不會同時有超過2^20 - 1個連線。

另外,還存在三個狀態指示位,用於加速鎖的處理。

IS_DESTROYED:   標識鎖物件將被釋放。

HAS_OBTRUSIVE: 標識鎖物件下有obtrusive鎖,新的鎖申請必須進入慢速申請路徑,釋放鎖時,也要先加鎖以保護已授予鎖連結串列。

HAS_SLOW_PATH:  標識鎖物件下是否有unobtrusive鎖。


5.3.2 干擾型(obtrusive)

相互間不相容,對於DML操作不通用。此類鎖的申請過程需要對鎖物件的讀寫鎖加寫鎖,對不同執行緒的鎖申請影響較大,因此顯的比較張揚。

scoped locks: X,S。

per-object locks: SU, SRO, SNW, SNRW, X。


5.4 加鎖路徑

鎖的申請過程分為兩種路徑,1)快路徑, 即只需要增加鎖個數計數來授予鎖; 2)慢路徑,需要對鎖物件讀寫鎖加寫鎖來授予鎖。


5.4.1 快路徑(fast path)

對於unobtrusive鎖,可以透過快速路徑來快速授予鎖。但是授予鎖有個前提,就是該鎖物件下沒有obtrusive鎖,因為unobtrusive與obtrusive之間有些鎖是互斥的,只有在沒有obtrusive鎖存在時,unobtrusive鎖才彼此相容。透過檢測鎖狀態的 HAS_OBTRUSIVE 位即可快速判斷。透過CAS操作即可更新鎖個數,同時也會檢測是否已有其他執行緒以張揚方式申請了鎖。CAS操作成功,即申請鎖成功。


5.4.2 慢路徑(slow path)

對於obtrusive鎖,以及當前申請unobtrusive鎖,而鎖物件下已經持有obtrusive鎖時,需要進入慢路徑申請鎖,即先對鎖物件下的讀寫鎖加寫鎖。在當前鎖物件進入慢路徑時,設定鎖狀態的 HAS_SLOW_PATH 位。如果是申請obtrusive鎖,則設定 HAS_OBTRUSIVE 位。


5.4.3 鎖點陣圖

鎖物件的快速路徑鎖申請鎖、已經授予的鎖佇列、正在等待鎖佇列都有標識其含有鎖型別的鎖點陣圖,透過點陣圖可以加快鎖相容判斷速度,避免每次遍歷鎖佇列。


5.4.4 快速路徑鎖物化

在申請obtrusive鎖進入慢路徑之前,要將當前執行緒透過快路徑獲取的鎖物化,即從鎖物件的鎖狀態計數器中減除,並放入到鎖物件的已經授予鎖列表中。因為鎖狀態計數器中只有鎖個數,不區分執行緒。而當前執行緒自己申請的unobtrusive鎖與obtrusive鎖不衝突。物化可以確保鎖狀態計數器中都是其他執行緒申請的,這樣就可以透過快速路徑鎖點陣圖快速判斷是否與當前申請鎖相容。


5.4.5 慢路徑鎖的授予條件

當且僅當滿足如下兩個條件時,才可以授予鎖。

1. 其他執行緒沒有持有不相容型別鎖。

2. 當前申請的鎖的優先順序高於請求等待列表中的。

首先透過鎖點陣圖判斷等待佇列,不相容則不能授予鎖。再判斷快速路徑,不相容則不能授予鎖。最後判斷授予鎖佇列,都相容則授予鎖,不相容,需要遍歷持有鎖佇列,檢查是否其他執行緒持有不相容鎖,是則不能授予,否則可以授予鎖。


關於亞信安慧AntDB資料庫


AntDB資料庫始於2008年,在運營商的核心繫統上,為全國24個省份的10億多使用者提供線上服務,具備高效能、彈性擴充套件、高可靠等產品特性,峰值每秒可處理百萬筆通訊核心交易,保障系統持續穩定執行近15年,並在通訊、金融、交通、能源、物聯網等行業成功商用落地。




來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026696/viewspace-3000202/,如需轉載,請註明出處,否則將追究法律責任。

相關文章