《數據庫系統概論》- 課本理論整理08之並發控制(concurrency control)


多個用戶 並發 存取DB時 ===》 會有產生多個事務同時存取同一數據的情況。
並發操作不加控制就會存取不正確的數據 ===》 破壞事務的一致性和DB的一致性。
因此DBMS提供並發控制保證DB中的數據安全性和完整性。

並發控制概述

事務是並發控制的單位,而保證事務的ACID特性是事務處理的重要任務。
事務的ACID特性遭到破壞的原因之一: 多個事務對DB並發操作造成的。
為了保證事務的一致性和隔離性,DBMS對並發操作進行正確的調度。

[案例: 飛機訂票系統的一個活動序列]

① 甲售票點(事務T1)讀出某航班的機票余額A, 設A=16;
② 乙售票點(事務T2)讀出同一航班的機票余額A, 也為16;
③ 甲售票點賣出一張票,修改余額 A <== (A - 1),A為15,將A寫回DB; // T1事務修改被丟失
④ 乙售票點賣出一張票,修改余額 A <== (A - 1), A為15,將A寫回DB; // T2事務修改A隨后覆蓋T1事務的修改

結果明明賣出兩張機票,DB中機票余額只減少1.

這種情況稱之為DB的不一致性,這種不一致性是【並發操作】引起的。
並發操作帶來的數據不一致性(unconsistency) ==> 丟失修改、不可重復讀和讀“臟”數據

導致數據不一致性的原因主要是: 【並發操作破壞事務的隔離性(isolation)

並發控制機制即用正確的方式調度並發操作,使一個用戶事務的執行不受其他事務的干擾,從而避免數據的不一致性。

並發控制的主要技術

1. 🔒封鎖(locking)
2. ⏰時間戳(timestamp)
3. 🪂樂觀控制法(optimistic schedular)
4. 🚉多版本並發控制(multi-version concurrency control, MVCC)

封鎖(locking)

封鎖即事務T在對某個數據對象eg: 表、記錄等操作之前,先向系統發出請求,對其加鎖。加鎖后事務T就對該數據對象具有一定的控制,在事務T釋放它的鎖之前,其他事務不能更新此數據對象

封鎖協議(locking protocol)

1. 一級封鎖協議 - 事務T在修改數據R之前必須先對其加X鎖,直到【事務結束才釋放】。 事務結束 =》 正常結束(COMMIT)和非正常結束(ROLLBACK)
2. 二級封鎖協議 - 在一級協議基礎上增加事務T在讀取數據R之前必須先對其加S鎖,【讀完后即釋放S鎖】
3. 三級封鎖協議 - 在一級協議基礎上增加事務T在讀取數據R之前必須先對其加S鎖,【直到事務結束才釋放】

活鎖(livelock)- 指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重復嘗試—失敗—嘗試—失敗的過程

[案例]

事務T1封鎖數據R
  - 此時事務T2請求封鎖數據R,T2等待
  - 此時事務T3請求封鎖數據R,T3等待
事務T1釋放數據R上的鎖
  - 系統首先批准T3的請求
        - 此時事務T3封鎖數據R
              - T2等待
              - T4請求封鎖數據R,T4等待
事務T3釋放數據R上的鎖
  - 系統首先批准T4的請求
        - 此時事務T4封鎖數據R  
              - T2等待
              =》 依次類推, T2有可能永遠等待下去。
★ 避免活鎖 =》 【先來先服務】 當多個事務請求封鎖同一數據對象時,封鎖子系統按請求封鎖的先后次序對事務排隊,數據對象上的鎖🔒一旦釋放就批准申請隊列中第一個事務獲得鎖。

死鎖(deadlock)- 兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。

- 事務T1封鎖數據R1, 事務T2封鎖數據R2
   - 事務T1又請求封鎖數據R2,事務T2又請求封鎖數據R1
     - 事務T1等待T2釋放R2上的鎖, 事務T2又申請封鎖R1,因為T1已經封鎖R1則T2只能等待T1釋放R1上的鎖
>>> T1在等待T2, T2又在等待T1的局面,T1、T2兩個事務永遠不能結束,最終形成死鎖。

解決死鎖的方法

1. 一次封鎖法 - 要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不繼續執行。 缺點:降低DBS中並發度
2. 順序封鎖法 - 要求每個事務順序執行

多版本並發控制(Multi Version Concurrency Control, MVCC) - 在DB中通過維護數據對象的多個版本信息來實現【高效並發控制】

【版本】指DB中數據對象的一個快照,記錄了數據對象某個時刻的狀態。

計算機存儲設備成本降低 =》 為DBS中的數據庫對象保留多個版本。
[案例]

- 一個數據對象A有兩個事務, T1是寫事務, T2是讀事務
    - 假定先啟動T1后啟動T2, T2事務必須等待事務T1執行結束釋放A上的封鎖后才獲得對A的封鎖。(T1和T2實串行執行)

多版本並發控制利用【物理存儲】上的【多版本】來維護數據的一致性。

多版本並發控制和封鎖控制相比最大的好處在於: 消除DB中數據對象 讀 和 寫操作的沖突,有效提高系統的性能。

總結

  1. DB的重要特征: 【為多個用戶提供數據共享】
  2. DBMS提供【並發控制機制】來協調【並發用戶】的【並發操作】以保證【並發事務】的【隔離性】和【一致性】從而保證DB的一致性。
  3. DB的並發控制以【事務】為單位,通常使用【封鎖技術】實現並發控制。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM