Oracle 鎖機制精細到 7 級模式 (0-6)。本文系統梳理鎖模式含義、業務語句對應關係、診斷查詢腳本、標準殺會話流程,並揭露 kill -9 OS進程 的嚴重後果。
| Mode | 名稱 | 兼容性 | 典型觸發語句 | 業務影響 |
|---|---|---|---|---|
| 0 | None | - | - | 無鎖 |
| 1 | Null (NULL) | 全兼容 | SELECT (極少見) | 僅標註關注 |
| 2 | Row-S (RS) / Sub Share | 兼容 1,2,3,4 | SELECT ... FOR UPDATE LOCK TABLE ... IN ROW SHARE MODE | 允許並發查詢/鎖定,阻止 DDL |
| 3 | Row-X (RX) / Sub Exclusive | 兼容 1,2 | INSERT/UPDATE/DELETE LOCK TABLE ... IN ROW EXCLUSIVE MODE | 允許並發查詢,阻止其他 DML/DDL |
| 4 | Share (S) | 兼容 1,2 | CREATE INDEX LOCK TABLE ... IN SHARE MODE | 阻止 DML,允許查詢 |
| 5 | S/Row-X (SRX) / Share Sub Exclusive | 兼容 1 | FK 父表 UPDATE/DELETE (需鎖定子表) LOCK TABLE ... IN SHARE ROW EXCLUSIVE MODE | 阻止其他 DML/DDL,僅允許查詢 |
| 6 | Exclusive (X) | 全不兼容 | ALTER TABLE/DROP/TRUNCATE LOCK TABLE ... IN EXCLUSIVE MODE | 完全獨佔,阻塞所有操作 |
SELECT ... FOR UPDATE = Mode 2 (RS) — 行級鎖,允許並發查詢-- 1. 核心視圖關聯:鎖對象 + 會話信息
SELECT
o.object_name,
l.locked_mode,
s.sid,
s.serial#,
s.username,
s.osuser,
s.machine,
s.program,
s.logon_time,
s.sql_id,
sq.sql_text
FROM v$locked_object l
JOIN v$session s ON l.session_id = s.sid
JOIN dba_objects o ON l.object_id = o.object_id
LEFT JOIN v$sql sq ON s.sql_id = sq.sql_id
ORDER BY s.logon_time;
LOCKED_MODE = 3 且長時間不變 → 疑似未提交事務阻塞SQL_TEXT 顯示正在執行/等待的語句LOGON_TIME 早於業務高峰 → 疑似棄置連接ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- IMMEDIATE: 立即回滾事務、釋放鎖、標記會話為 KILLED,客戶端下次操作報 ORA-00028
-- 1. 獲取 OS 進程號 (SPID)
SELECT p.spid FROM v$process p JOIN v$session s ON p.addr = s.paddr WHERE s.sid = :sid;
-- 2. OS 層面殺進程 (Linux/Unix)
kill -9
-- Windows: orakill SID SPID (需管理員權限)
| 維度 | KILL SESSION | KILL -9 OS PROCESS |
|---|---|---|
| 事務回滾 | SMON 自動回滾,保證一致性 | 事務中斷,SMON 需額外恢復,耗時不可控 |
| 鎖釋放 | 即時、完整 | 可能殘留鎖結構,需 PMON 清理 |
| 會話清理 | 幹淨,資源正常釋放 | 可能導致共享內存碎片、連接池感知延遲 |
| 影響面 | 單會話 | 一個 OS 進程可能服務多個會話 (共享服務器/DRCP),誤傷範圍大 |
| 場景 | 特徵 | 優化方案 |
|---|---|---|
| 熱點行更新 | 多會話 UPDATE 同一行,Mode 3 排隊 | 業務拆分、樂觀鎖 (版本號)、減少事務持有時間 |
| 未索引外鍵 | 父表 DELETE 導致子表全表鎖 (Mode 4/5) | 為所有外鍵列創建索引 (單條最有效優化) |
| 長事務 | 批量處理未分批提交,鎖持有時間長 | 分批提交、自治事務、DBMS_PARALLEL_EXECUTE |
| DDL 與 DML 衝突 | 白天執行 ALTER INDEX/DROP PARTITION | 維護窗口執行、ONLINE DDL (12c+) |
| 棄置連接 | 連接池未驗證、應用異常未關閉連接 | 連接池配置 testOnBorrow=true、validationQuery=SELECT 1 FROM DUAL |