並發控制的核心價值
DBMS 核心優勢在於多用戶、多應用共享資料。並發性指多個應用程式幾乎同時存取同一資料的能力。若無有效並發控制,將損害資料完整性與一致性:
- 遺失更新:A、B 同時讀取同一列計算新值,A 先更新,B 後更新覆蓋 → A 更新遺失
- 不可重複讀:A 讀取某列,執行其他 SQL,再次讀取同列發現值已被 B 修改
- 讀取未提交資料 (Dirty Read):A 更新未提交,B 讀取新值,A 隨後回滾 → B 基於錯誤資料處理
在維護資料完整性前提下,提供最大吞吐量(最大化並發存取)的軟體機制即為鎖。
鎖機制核心概念
鎖模式
- 共享鎖 (Share Lock, S):關聯唯讀操作。持有者可讀,其他應用亦可讀同一資料
- 排他鎖 (Exclusive Lock, X):關聯寫入操作。持有者可更新,持有期間其他應用無法使用該資料,直至提交釋放
DB2 UDB 與 IRLM (MVS 位址空間) 協作管理鎖,IRLM 追蹤鎖與擁有者,判斷資源可用性。資源可為鎖定或共享,視持有者處理類型與請求者預期處理類型而定。
鎖粒度
DB2 UDB 提供不同鎖定層級控制鎖定範圍:從單一列到整個表空間。多種粒度並存的理由:
- 某些應用需大範圍讀寫,某些僅需窄範圍
- 單一粒度會降低系統效能:過度鎖定強制他人等待;過細粒度消耗過多系統資源管理鎖
- 多粒度並存大幅提升並發層級
等待、超時與死結
- 暫掛 (Wait):請求鎖被他人持有且不可共享 → 進程掛起。優先序:持有鎖者請求、鎖升級請求 > 新請求;同組內 FIFO
- 超時 (Timeout):暫掛超過預設時間間隔 → 終止應用,SQLCA 回傳錯誤碼。COMMIT/ROLLBACK 不受超時影響
- 死結 (Deadlock):兩應用各持有對方所需資源鎖 → 僵持。預設間隔後 DB2 終止工作量較小者,釋放鎖讓另一方繼續,SQLCA 回傳描述性錯誤
死結經典場景:A 鎖頁 X → B 鎖頁 Y → A 請求頁 Y (掛起) → B 請求頁 X (掛起) → 雙方無法繼續。
實用程式與指令的並發機制
SQL 應用用事務鎖,DB2 實用程式用聲明 (Claim)、放棄 (Drain)、相容性規則:
- 聲明:通知 DB2 正存取特定物件。提交後通常不存續,下一工作單元需新聲明。有聲明存在時不可執行 Drain
- 放棄:阻止新聲明 + 等待現有聲明釋放。導致 DB2 讓所有聲明該資源的應用達到提交點但阻止新聲明。Drain 鎖防止衝突程式同時 Drain 同一物件
- 相容性規則:兩實用程式不需以不相容模式同時存取同一物件視為相容。啟動時檢查物件是否被他用且不相容
資料庫設計層面的並發優化
分區表:大表並發的關鍵
強烈建議大表建為分區表。單一分區索引鍵範圍分割,每分區為獨立資料集,DB2 可獨立處理。優勢:
- 大量批次作業 (INSERT/UPDATE/DELETE) 可拆分為針對不同分區的較小作業並發執行,縮短佔用時間
- 實用程式作業可針對特定分區,允許其他作業/應用並發存取其他分區
- 許多 DB2 實用程式本身支援分區並行
鎖升級:平衡開銷與並發
應用持有大量頁/列/LOB 鎖時,DB2 取得表/表空間鎖並釋放細粒度鎖。分區鎖定 (LOCKPART YES) 時僅升級當前被鎖分區,未鎖分區保持未鎖狀態。一旦發生升級,後續存取未鎖分區改用表空間鎖。
觸發升級的準確時機由 LOCKSIZE 與 LOCKMAX 決定。
LOCKSIZE 選擇指南
| 選項 | 適用場景 |
ANY (預設) | 讓 DB2 選擇。非 LOB 表通常用 PAGE,LOB 表用 TABLESPACE。建議保留預設,除非效能監控有明確理由修改 |
ROW | DB2 V4 引入。非萬靈丹。隨機存取、頁面競爭激烈時可大幅減少衝突;但多應用不同順序更新同頁同列可能導致更多死結。決策本質:較高鎖開銷 vs 潛在並發提升的權衡 |
PAGE | V4 前最小單元。適合順序存取、低競爭場景 |
TABLE/TABLESPACE | 確定無其他重要應用需並發存取該物件前使用 |
LOB | 大物件專用 |
小型高頻表
尺寸小且高使用率表,特別是每頁列數多時,考慮 LOCKSIZE ROW。因表小,鎖粒度對開銷影響微乎其微。
DB2 物件與授權分組原則
- 同一應用邏輯相關表分組到同一資料庫
- 每應用程式引用盡可能少的資料庫
- 不同授權 ID 使用不同資料庫
- 原則:「聚合相似、分離差異」
應用程式設計層面的並發最佳實踐
- 盡可能晚存取關鍵資源:SQL 取得/更新資料時間盡可能貼近提交點,減少鎖定總時間
- 盡可能快提交工作:達到資料一致性臨界點後立即 COMMIT(唯讀應用亦同)。SQL 故障即刻 ROLLBACK,避免失敗語句長時間鎖定資源
- 盡可能快關閉游標:儘早
CLOSE CURSOR 釋放鎖與資源
- 應用重試邏輯:收到死結/超時指示時自動重試(可多次),
SQLCA.SQLERRD(3) 回傳原因碼區分死結/超時,讓應用自我恢復無需人工介入
結語
並發控制是 DB2 核心能力。從鎖模式、粒度、升級機制,到資料庫設計(分區、LOCKSIZE)、應用編碼習慣(晚鎖早提交、快關游標、重試邏輯),每個層面的精細調校共同構建高並發、高完整性的資料庫系統。理解並善用這些機制,是 DBA 與開發者打造高效能應用的關鍵。