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

DB2 會話級鎖等待策略:SET CURRENT LOCK TIMEOUT 精準控制

     編輯:DB2 教學

背景演進

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 要求明確系統

影響鎖類型範圍

此設定僅影響:

  • 列鎖
  • 表鎖
  • 索引鍵鎖
  • MDC 區塊鎖

不影響:表空間鎖、資料庫鎖、內部系統鎖。

實戰範例(使用 SAMPLE 資料庫)

# 終端機 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,不等待

最佳實務建議

  1. 應用程式層集中管理:在連線池初始化或事務開始時,依業務類型設定適當模式。
  2. OLTP 核心交易:建議 SET CURRENT LOCK TIMEOUT 5(5 秒),避免長時間阻塞連線池。
  3. 報表/批次查詢:可用 WAIT 或較長秒數,接受等待換取一致性讀取。
  4. 監控指標:收集 LOCK_WAITS、LOCK_TIMEOUTS、DEADLOCKS 計數器,觀察調整成效。

官方文件參考

IBM Knowledge Center: SET CURRENT LOCK TIMEOUT statement (r0011874.htm)

小結

SET CURRENT LOCK TIMEOUT 將鎖等待策略從「資料庫級」下放到「會話級」,賦予應用程式精細控制權。善用四大模式,配合業務 SLA 設定,能有效降低鎖爭用對系統吞吐的衝擊。

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