在多使用者資料庫系統中,成百上千的交易可能同時存取相同資料。若缺乏協調機制,將導致資料不一致,破壞交易的隔離性與資料庫的一致性。並發控制的核心任務,正是對並發操作進行正確調度,確保交易 ACID 特性中的隔離性(Isolation)與一致性(Consistency)。
典型案例:飛機訂票系統。甲、乙兩售票點同時讀取餘票數 A=16,甲賣出一張寫回 A=15,乙賣出一張也寫回 A=15。實際賣出兩張,資料庫僅減 1。原因:乙交易的寫入覆蓋了甲交易的修改。
交易 T1 讀取資料後,T2 執行更新,導致 T1 再次讀取結果不同。包含三種情況:
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 佇列等多重機制,在保證資料正確性與系統吞吐量間取得平衡。