鎖是資料庫並發控制的核心。Oracle 採用多層次鎖架構,本文系統梳理鎖類型、相容性、阻塞判斷與處置實戰。
| 類別 | 保護對象 | 主要鎖類型 |
|---|---|---|
| DML 鎖 (Data Locks) | 資料完整性 | TM (Table/表級)、TX (Transaction/行級) |
| DDL 鎖 (Dictionary Locks) | 物件結構 | 排他 DDL 鎖、共享 DDL 鎖、可剖析鎖 |
| 內部鎖與 Latch | 內部結構 | Latch、Mutex、Buffer Cache 鎖、Library Cache 鎖 |
| 維度 | 悲觀鎖 | 樂觀鎖 |
|---|---|---|
| 語法 | SELECT ... FOR UPDATE [NOWAIT] | 版本號/時間戳比對 |
| 鎖定時機 | 查詢即鎖定 | 更新時檢查 |
| 阻塞行為 | 其他 DML 阻塞,DDL 報 ORA-00054 | 無阻塞,衝突時回滾重試 |
| 適用場景 | 高衝突、短事務 | 低衝突、長事務、離線場景 |
Oracle 建議優先使用悲觀鎖,安全性更高。
INSERT:主鍵衝突時等待UPDATE / DELETE:目標行被鎖時等待SELECT ... FOR UPDATE:主動加鎖-- 找出阻塞鏈
SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait,
sql_id, blocking_sql_id
FROM v$session
WHERE blocking_session IS NOT NULL;
-- 詳細物件層級
SELECT s.sid, s.serial#, s.username, s.machine, s.program,
o.object_name, l.locked_mode
FROM v$locked_object l, dba_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid;
ORA-00060 並回滾陳述式 (非整個事務)V$LOCK:當前鎖持有/等待V$SESSION_WAIT / V$SESSION:等待事件V$LOCKED_OBJECT:被鎖物件DBA_BLOCKERS / DBA_WAITERS:阻塞鏈 (舊版)掌握鎖機制,才能從根源解決並發效能與死鎖難題。