鎖模式 (0-6) 是並發故障診斷的第一語言。本文壓縮為「模式-語句-影響-查殺」四欄速查表,附標準診斷查詢與嚴禁 OS kill -9 鐵律。
| Mode | 名稱 | 典型觸發語句 | 兼容模式 | 業務影響 |
|---|---|---|---|---|
| 0 | None | - | - | 無鎖 |
| 1 | Null | 極少見 | 全兼容 | 標註關注 |
| 2 | Row-S (RS) | SELECT ... FOR UPDATELOCK TABLE ... ROW SHARE | 1,2,3,4 | 行級共享鎖,允許並發查詢/鎖定,阻止 DDL |
| 3 | Row-X (RX) | INSERT/UPDATE/DELETELOCK TABLE ... ROW EXCLUSIVE | 1,2 | 最常見 DML 鎖,允許查詢,阻塞其他 DML/DDL |
| 4 | Share (S) | CREATE INDEXLOCK TABLE ... SHARE | 1,2 | 阻止 DML,允許查詢 |
| 5 | S/Row-X (SRX) | FK 父表 UPDATE/DELETELOCK TABLE ... SHARE ROW EXCLUSIVE | 1 | 阻止其他事務 DML,僅允許查詢 |
| 6 | Exclusive (X) | ALTER/DROP/TRUNCATE TABLELOCK TABLE ... EXCLUSIVE | 無 | 完全獨佔,阻塞所有 |
SELECT ... → Mode 1 (極少見於 v$locked_object)SELECT ... FOR UPDATE → Mode 2INSERT/UPDATE/DELETE → Mode 3 (未提交前持有)CREATE INDEX → Mode 3/4-- 1. 基礎鎖視圖
SELECT object_id, session_id, locked_mode FROM v$locked_object;
-- 2. 關聯會話詳情 (核心)
SELECT
o.object_name,
l.locked_mode,
s.sid, s.serial#,
s.username, s.osuser, s.machine, s.program,
s.logon_time,
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;
判斷異常:LOGON_TIME 異常早 + LOCKED_MODE=3 長時間不變 → 疑似未提交事務/棄置連接。
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
IMMEDIATE:立即回滾、釋放鎖、標記 KILLED,客戶端下次操作收到 ORA-00028IMMEDIATE:標記待殺,會話下次調用才真正終止 (不推薦故障處理)| 原因 | 後果 |
|---|---|
| 一個 OS 進程可服務多會話 (MTS/DRCP) | 誤殺無關會話,業務大面積中斷 |
| 事務中斷無序回滾 | SMON 需額外恢復,恢復時間不可控 |
| 共享內存結構可能損壞 | 實例不穩定,甚至需重啟 |
| 連接池感知延遲 | 應用端大量報錯「連接重置」 |