首頁
編程語言
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 引入 **會話級** 控制,支援四種模式:

SET CURRENT LOCK TIMEOUT WAITSET CURRENT LOCK TIMEOUT NOT WAITSET CURRENT LOCK TIMEOUT NULLSET CURRENT LOCK TIMEOUT <秒數>
語法行為適用場景
無限等待(等同 -1)關鍵交易、不可中斷批次
立即返回 SQL0911N(鎖不可用)高併發 OLTP、快速失敗重試
使用資料庫級 `LOCKTIMEOUT` 設定繼承全域預設
等待指定秒數,逾時返回 SQL0911N批次作業、報表查詢設合理上限

實戰演示

-- Session 1:持有鎖不提交
db2 +c "CONNECT TO SAMPLE; CREATE TABLE T(C1 INT); INSERT INTO T VALUES(1);"

-- Session 2:預設無限等待
db2 "CONNECT TO SAMPLE; SELECT * FROM T;"  -- 卡住

-- Session 3:設定 NOT WAIT
db2 "CONNECT TO SAMPLE; SET CURRENT LOCK TIMEOUT NOT WAIT; SELECT * FROM T;"
-- 立即報錯:SQL0911N  The current transaction has been rolled back because of a deadlock or timeout.

程式整合方式

  • 嵌入式 SQL / Stored Procedure:直接執行 `SET CURRENT LOCK TIMEOUT ...`
  • CLI/ODBC:配置 `db2cli.ini`:
    LOCKTIMEOUT = WAIT | NOT WAIT | WAIT <秒數> | <秒數>
    驅動程式自動發送對應 SET 陳述式。
  • JDBC:`connection.setLockTimeout(秒數)`(需驅動程式支援)。

影響範圍

僅影響 **列鎖、表鎖、索引鍵鎖、MDC 區塊鎖**;不影響目錄鎖、表空間鎖、公用程式鎖。

設計建議

  • OLTP 核心交易:`WAIT 5`~`10` 秒,避免長時間阻塞佔用連接池。
  • 報表/查詢專用連接:`NOT WAIT` 或 `WAIT 1`,快速失敗轉重試或走備份庫。
  • 批次夜間作業:`WAIT 300`(5 分鐘),容忍短暫鎖競爭。
  • 監控指標:`LOCK_WAITS`、`LOCK_WAIT_TIME`、`LOCK_TIMEOUTS`(每會話可異)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved