DB2 V8.2 前,僅能透過資料庫配置 `LOCKTIMEOUT` 全域設定(-1 表示無限等待)。V8.2 引入 **會話級** 控制,支援四種模式:
| 語法 | 行為 | 適用場景 |
|---|---|---|
| 無限等待(等同 -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.
LOCKTIMEOUT = WAIT | NOT WAIT | WAIT <秒數> | <秒數>僅影響 **列鎖、表鎖、索引鍵鎖、MDC 區塊鎖**;不影響目錄鎖、表空間鎖、公用程式鎖。