首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 行級鎖 SELECT FOR UPDATE 進階用法全解析

     編輯:Oracle 資料庫相關知識

SELECT ... FOR UPDATE 是手動加行級排他鎖的核心語法,支援 WAIT/NOWAIT/SKIP LOCKED 三種等待模式,適用於「先鎖後改」的業務邏輯。

語法完整形式

SELECT ... FOR UPDATE [OF column_list] [WAIT n | NOWAIT | SKIP LOCKED];

四大模式實戰對比

模式語法行為適用場景
預設等待FOR UPDATE無限期等待鎖釋放批次作業、低併發
等待 N 秒FOR UPDATE WAIT 5超時回傳 ORA-30006線上交易、需控制回應時間
不等待FOR UPDATE NOWAIT立即回傳 ORA-00054高併發搶單、秒殺
跳過已鎖FOR UPDATE SKIP LOCKED略過被鎖行,只回傳可鎖行佇列消費者、分散式任務分派

實戰範例:建立工作佇列消費者

-- 消費者進程
LOOP
  SELECT id, payload
  INTO   v_id, v_payload
  FROM   job_queue
  WHERE  status = 'PENDING'
  FOR UPDATE SKIP LOCKED;  -- 只拿未被處理的任務

  -- 處理業務
  process_job(v_payload);

  UPDATE job_queue SET status = 'DONE' WHERE id = v_id;
  COMMIT;
END LOOP;

多消費者並發時,SKIP LOCKED 保證每個任務只被一個消費者處理,無需應用層協調。

OF 子句:多表聯結時精準鎖定

SELECT o.order_id, o.amount, c.credit_limit
FROM   orders o, customers c
WHERE  o.cust_id = c.cust_id
AND    o.status = 'NEW'
FOR UPDATE OF o.amount;  -- 只鎖 orders.amount,不鎖 customers 表

避免不必要的鎖擴大,減少衝突。

注意事項

  • FOR UPDATE 鎖在 COMMIT/ROLLBACK 時釋放,**不可**在游標開啟期間跨事務。
  • NOWAIT/WAIT/SKIP LOCKED 11g+ 全支援,10g 僅支援 NOWAIT。
  • 若查詢包含 DISTINCT/GROUP BY/UNION 等導致不可更新,會報 ORA-02014。

與 DML 隱含鎖的關係

INSERT/UPDATE/DELETE 隱含行級鎖 (TX),效果等同 FOR UPDATE,但 SELECT FOR UPDATE 可提前鎖定、延後修改,實現樂觀離線鎖或長事務拆分。

掌握四種等待模式與 OF 子句,行級鎖成為併發控制的精準手術刀。

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