FOR UPDATE NOWAIT 讓查詢在目標行已被鎖定時立即拋出異常 (ORA-00054) 而非等待,適用於高併發下需快速失敗、避免長時間阻塞的業務場景。
SELECT * FROM table_name
WHERE condition
FOR UPDATE NOWAIT;
ORA-00054: resource busy and acquire with NOWAIT specifiedCOMMIT 或 ROLLBACK 釋放-- 業務邏輯:查詢商品圖片並標記處理中
SELECT *
FROM hold_mc_site_product_pic pic
WHERE pic.id = 730127
FOR UPDATE NOWAIT;
若返回成功 → 取得鎖,執行後續業務邏輯 → COMMIT 釋放。
若拋出 ORA-00054 → 表示該筆資料正被他人處理,業務邏輯可選擇跳過、重試或通知用戶。
STATUS='PENDING')SELECT ... FOR UPDATE NOWAITCOMMIT此模式實現**「樂觀佇列」**:資料庫層面保證同一筆資料同一時間僅有一個執行緒處理,無需應用層分散式鎖。
| 語法 | 行為 | 適用場景 |
|---|---|---|
| FOR UPDATE | 無限期等待鎖釋放 | 低併發、容忍等待 |
| FOR UPDATE NOWAIT | 立即失敗拋出 ORA-00054 | 高併發、需快速失敗、避免阻塞 |
| FOR UPDATE WAIT 5 | 最多等待 5 秒再失敗 | 折衷方案、允許短暫等待 |
| FOR UPDATE SKIP LOCKED (11g+) | 跳過已鎖定行,只返回可鎖定行 | 佇列消費者模式、批次處理最佳 |
EXCEPTION WHEN OTHERS THEN IF SQLCODE = -54 THEN ... 處理 ORA-00054SKIP LOCKED 實現無鎖佇列消費V$SESSION_WAIT 事件 enq: TX - row lock contention 發現熱點核心價值:NOWAIT 將「等待」轉為「快速失敗」,讓應用層掌握流控主動權,是高併發系統資料庫層面的關鍵設計模式。