互動式查詢(如命令中心)會對讀取列加 S 鎖(共享鎖),若同一時間另一 Session 要 UPDATE 需 X 鎖(排他鎖),便會陷入鎖等待甚至死結。快速定位持有鎖與等待鎖的應用程式,是解決鎖爭用的關鍵。
db2 update dbm cfg using dft_mon_lock on
此為資料庫管理員層級設定,影響所有新連線;生效即刻,無需重啟實例。
db2 get snapshot for locks on > snap.log
輸出包含:tables、bufferpools、tablespaces、database 等鎖資訊。重點關注 List of Locks 區塊,依 Application handle 即可對應具體應用程式。
db2 update dbm cfg using dft_mon_lock off
若不想動態修改 dbm cfg,可用 Session 級開關:
db2 update monitor switches using lock on
db2 get snapshot for locks on SAMPLE
或直接查詢系統表函數(無需開關,效能較佳):
SELECT * FROM TABLE(SNAPSHOT_LOCK('dbname', -1)) AS LOCK
搭配 APPLICATION_HANDLE 即可鎖定問題 Session。
| 欄位 | 含義 |
|---|---|
| LOCK_OBJECT_TYPE | ROW / TABLE / INDEX KEY / BLOCK (MDC) |
| LOCK_MODE | S / X / U / IS / IX / SIX / IN / Z / NW |
| LOCK_STATUS | GRANTED(持有) / WAITING(等待) |
| APPLICATION_HANDLE | 對應應用程式唯一代碼 |
| TABLE_SCHEMA / TABLE_NAME | 被鎖定物件 |
確認阻塞應用程式後,可用:
db2 force application ()
謹慎使用,會導致該應用程式事務回滾。
「開關 → 快照 → 關閉」三步走,配合 SNAPSHOT_LOCK 表函數隨時查詢,構成 DB2 鎖爭用排查的標準動作。建議將此流程寫入運維手冊,並定期演練。