資料庫是多使用者共享資源。並發存取若無控制,會導致髒讀、不可重複讀、幻讀,破壞一致性。Oracle 透過鎖機制實現隔離性,保障交易 ACID 特性。本文系統整理 Oracle 鎖類型、監控視圖、等待分析與死鎖處理實戰流程。
| 分類 | 保護對象 | 主要類型 |
|---|---|---|
| DML 鎖 (Data Locks) | 資料完整性 | TM 鎖 (Table Lock)、TX 鎖 (Transaction/Row Lock) |
| DDL 鎖 (Dictionary Locks) | 物件結構 (表、索引等) | Exclusive/Share DDL Locks |
| 內部鎖與 Latch | 記憶體結構 (SGA、快取等) | Latch、Mutex、Buffer Locks |
本文聚焦 DML 鎖(最常見業務影響)。
NULL (0), SS (1), SX (2), S (3), SSX (4), X (5), X (6)。| SQL 操作 | TM 鎖模式 | |
|---|---|---|
| SELECT | 無 (僅查詢不加鎖) | |
| INSERT/UPDATE/DELETE | SX (Row Exclusive, 3) | |
| SELECT ... FOR UPDATE | SX (Row Exclusive, 3) | |
| LOCK TABLE ... IN ROW SHARE MODE | SS (Row Share, 2) | |
| LOCK TABLE ... IN EXCLUSIVE MODE | X (Exclusive, 6) |
| 視圖 | 用途 |
|---|---|
| V$LOCK | 當前所有鎖狀態 (TYPE, ID1, ID2, LMODE, REQUEST, SID) |
| V$SESSION | Session 資訊 (SID, SERIAL#, USERNAME, STATUS, SQL_ID) |
| V$SESSION_WAIT | Session 等待事件 (EVENT, P1, P2, P3) |
| DBA_BLOCKERS / DBA_WAITERS | 封鎖鏈快速查詢 (舊版相容) |
| V$TRANSACTION | 交易狀態 (XIDUSN, XIDSLOT, XIDSQN, USED_UBLK) |
SELECT blocking_session, sid, serial#, username, sql_id, event, seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL;
SELECT s.sid, s.serial#, s.username, s.sql_id, sq.sql_text
FROM v$session s, v$sql sq
WHERE s.sid = (SELECT blocking_session FROM v$session WHERE sid = :victim_sid)
AND s.sql_id = sq.sql_id;
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;兩個以上 Session 循環等待對方持有的資源(典型:Session A 鎖 Row 1 等 Row 2,Session B 鎖 Row 2 等 Row 1)。
ORA-00060: deadlock detected。alert_.log 並產生 Trace 檔 (user_dump_dest/diagnostic_dest)。ora__.trc )。| 原因 | 徵兆 | 解決方案 |
|---|---|---|
| 應用程式更新順序不一致 | 不同模組以不同順序更新同組表 | 規範統一存取順序 (如按 PK 排序) |
| Bitmap 索引於高併發 DML | Trace 顯示 INDEX 相關 | 改為 B-tree 索引或延遲索引維護 |
| 外鍵未建索引 | 父表刪除/更新導致全表鎖 | 為 FK 欄位建立索引 |
| SELECT ... FOR UPDATE NOWAIT 缺失 | 邏輯爭用 | 加 NOWAIT/WAIT n 或調整隔離級別 |
Trace 顯示 IND_T_PRODUCT_HIS_STATE (Bitmap Index) 參與死鎖。
解決:ALTER INDEX IND_T_PRODUCT_HIS_STATE REBUILD PARAMETERS ('REBUILD_TYPE=NORMAL'); 或 DROP ... CREATE INDEX ... 改為 B-tree。


DDL_LOCK_TIMEOUT (11g+) 避免 DDL 無限等待。DBA_HIST_ACTIVE_SESS_HISTORY 分析歷史鎖爭用熱點。掌握 Oracle 鎖機制、善用動態效能視圖、建立標準化診斷流程,是 DBA 從「被動滅火」轉向「主動優化」的關鍵。死鎖不可怕,可怕的是缺乏系統化分析與預防機制。