多個用戶 並發 存取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中數據對象 讀 和 寫操作的沖突,有效提高系統的性能。
總結
- DB的重要特征: 【為多個用戶提供數據共享】
- DBMS提供【並發控制機制】來協調【並發用戶】的【並發操作】以保證【並發事務】的【隔離性】和【一致性】從而保證DB的一致性。
- DB的並發控制以【事務】為單位,通常使用【封鎖技術】實現並發控制。