在多用戶同時訪問同一數據時,保證數據一致性與完整性,同時最大化吞吐量。串行化執行雖安全但性能不可接受,DB2 採用鎖機制實現高並發。
| 異常 | 場景 | 鎖防護 |
|---|---|---|
| 丟失更新 | A、B 同讀同改,A 先提交,B 後提交覆蓋 A | 排他鎖 (X) 序列化寫操作 |
| 不可重複讀 | A 兩次讀同一行,中間 B 修改提交 | 共享鎖 (S) 保持讀穩定性 |
| 讀未提交數據 | A 更新未提交,B 讀到髒數據,A 回滾 | 隔離級別控制 S 鎖持有時間 |
DB2 支持 Row / Page / Table / Table Space 多級粒度。細粒度並發高但開銷大;粗粒度開銷小但並發低。優化器根據 SQL、統計信息、LOCKSIZE 表屬性動態選擇或升級。
當事務在單表/表空間持有大量行/頁鎖超過閾值,DB2 自動升級為表/表空間鎖並釋放細粒度鎖,平衡並發與開銷。可通過 LOCKLIST、MAXLOCKS 配置閾值。
LOCKTIMEOUT (默認 -1 無限等待) 時終止事務,返回 SQLCODE -911/913。COMMIT/ROLLBACK 不受超時限制。| 參數 | 建議 |
|---|---|
| LOCKLIST | 根據並發事務數與平均鎖數估算,避免鎖升級過早 |
| MAXLOCKS | 單事務佔用鎖列表百分比上限,建議 10-20% |
| LOCKTIMEOUT | OLTP 設 10-30 秒,防止長時間阻塞;批處理可設 -1 |
| DLCHKTIME | 死鎖檢測間隔,默認 10 秒,高並發可降至 5 秒 |
-- 開啟鎖監控
db2 update dbm cfg using dft_mon_lock on
-- 獲取鎖快照
db2 get snapshot for locks on DBNAME > lock.snap
-- 關鍵欄位:Application Handle, Lock Mode, Lock Status, Object Name
-- 分析後關閉監控
db2 update dbm cfg using dft_mon_lock off