首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

資料庫並發控制機制深度解析:鎖、死鎖與活鎖的防禦策略

     編輯:DB2 教學

前言:為何需要並發控制?

在多使用者資料庫系統中,成百上千的交易可能同時存取相同資料。若缺乏協調機制,將導致資料不一致,破壞交易的隔離性與資料庫的一致性。並發控制的核心任務,正是對並發操作進行正確調度,確保交易 ACID 特性中的隔離性(Isolation)與一致性(Consistency)。

交易並發執行的三種模式

  • 串行執行:同一時間僅一個交易運行,資源利用率極低,不符合資料庫共享特性。
  • 交叉並發方式:單處理器系統中,多交易操作輪流穿插執行,雖非真正並行,但能減少 CPU 空閒時間,提升吞吐量。
  • 同時並發方式:多處理器系統中,多交易真正並行運行,效能最佳。

並發帶來的三大資料不一致問題

1. 丟失修改

典型案例:飛機訂票系統。甲、乙兩售票點同時讀取餘票數 A=16,甲賣出一張寫回 A=15,乙賣出一張也寫回 A=15。實際賣出兩張,資料庫僅減 1。原因:乙交易的寫入覆蓋了甲交易的修改。

2. 不可重複讀

交易 T1 讀取資料後,T2 執行更新,導致 T1 再次讀取結果不同。包含三種情況:

  1. T2 修改了 T1 讀取的資料值。
  2. T2 刪除了 T1 讀取範圍內的記錄(幻影現象)。
  3. T2 插入了符合 T1 查詢條件的新記錄(幻影現象)。

3. 讀「髒」資料

T1 修改資料並寫回磁碟,T2 讀取該資料,隨後 T1 因故障回滾,資料恢復原值。T2 讀到的即為已失效的「髒資料」。

並發控制核心技術:封鎖

商用 DBMS 多採用封鎖法。依控制粒度分為兩類基本鎖:

鎖類型別稱相容性適用場景
排它鎖寫鎖僅持有者可讀寫,他交易不可加任何鎖UPDATE、DELETE、INSERT
共享鎖讀鎖他交易可加 S 鎖,不可加 X 鎖SELECT

鎖相容矩陣以 Y/N 標示請求能否滿足,是並發控制子系統調度的核心依據。

封鎖引發的新問題:死鎖與活鎖

死錯

T1 鎖 R1 等 R2,T2 鎖 R2 等 R1,雙方永久等待。預防策略包括:

  • 一次封鎖法:交易啟動時一次鎖定所有需用資料。缺點:降低並發度,難以預知所有鎖對象。
  • 順序封鎖法:規定全域鎖順序,按序申請。缺點:維護成本高,難以在動態資料庫環境落實。

實務上,DBMS 多採用診斷與解除:

  • 超時法:等待超時視為死鎖,實現簡單但易誤判。
  • 交易等待圖法:週期性構建有向圖(節點=交易,邊=等待關係),檢測迴路。一旦發現迴路,選擇代價最小的犧牲者回滾。

活鎖

T1 釋放鎖後,系統優先批准 T3、T4... 請求,導致 T2 永遠等待。解決方案:採用先來先服務(FCFS)策略,建立請求佇列,鎖釋放時嚴格按順序授予。

總結

並發控制是資料庫多使用者環境的基石。封鎖雖能有效解決一致性問題,但引入死鎖、活鎖風險。現代 DBMS 結合預防、診斷、FCFS 佇列等多重機制,在保證資料正確性與系統吞吐量間取得平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved