DB2 V8.2 前,鎖等待逾時僅能透過資料庫配置參數 LOCKTIMEOUT 全域設定(預設 -1 表永久等待),所有應用程式共用單一數值,缺乏彈性。V8.2 引入 專用暫存器 CURRENT LOCK TIMEOUT,允許單一 Session 自訂鎖等待行為,互不干擾。
SET [CURRENT] LOCK TIMEOUT
{ WAIT | NOT WAIT | NULL | | }
| 模式 | 行為 | SQLCODE/SQLSTATE | 適用場景 |
|---|---|---|---|
WAIT | 無限期等待直到取得鎖 | 無(除非死結) | 批次作業、長交易、容忍等待 |
NOT WAIT | 立即回傳錯誤,不等待 | SQLCODE -911 / SQLSTATE 40001 | 高併發 OLTP、需快速失敗重試 |
NULL | 沿用資料庫 LOCKTIMEOUT 設定 | 依全域參數 | 預設行為、維持相容性 |
n (秒數) | 等待 n 秒,逾時回錯 | SQLCODE -911 / SQLSTATE 40001 | 可控等待、SLA 要求明確系統 |
此設定僅影響:
不影響:表空間鎖、資料庫鎖、內部系統鎖。
# 終端機 1:持有鎖的 Session
db2 +c
connect to sample
create table test(id int, name char(10))
commit
insert into test values(1,'test')
-- 故意不 commit,持有 X 鎖
# 終端機 2:設定 NOT WAIT 嘗試讀取
db2 +c
connect to sample
SET CURRENT LOCK TIMEOUT NOT WAIT
select * from test where id = 1
-- 立即回傳 SQL0911N,不等待
SET CURRENT LOCK TIMEOUT 5(5 秒),避免長時間阻塞連線池。WAIT 或較長秒數,接受等待換取一致性讀取。LOCK_WAITS、LOCK_TIMEOUTS、DEADLOCKS 計數器,觀察調整成效。IBM Knowledge Center: SET CURRENT LOCK TIMEOUT statement (r0011874.htm)
SET CURRENT LOCK TIMEOUT 將鎖等待策略從「資料庫級」下放到「會話級」,賦予應用程式精細控制權。善用四大模式,配合業務 SLA 設定,能有效降低鎖爭用對系統吞吐的衝擊。