首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 鎖表問題診斷與解決實戰:鎖模式詳解、查殺腳本、OS 級誤區

     編輯:Oracle 資料庫基礎

前言:鎖是並發控制的基石,也是故障高發區

Oracle 鎖機制精細到 7 級模式 (0-6)。本文系統梳理鎖模式含義、業務語句對應關係、診斷查詢腳本、標準殺會話流程,並揭露 kill -9 OS進程 的嚴重後果。

一、 Oracle 鎖模式完整對照表 (v$locked_object.locked_mode)

Mode名稱兼容性典型觸發語句業務影響
0None--無鎖
1Null (NULL)全兼容SELECT (極少見)僅標註關注
2Row-S (RS) / Sub Share兼容 1,2,3,4SELECT ... FOR UPDATE
LOCK TABLE ... IN ROW SHARE MODE
允許並發查詢/鎖定,阻止 DDL
3Row-X (RX) / Sub Exclusive兼容 1,2INSERT/UPDATE/DELETE
LOCK TABLE ... IN ROW EXCLUSIVE MODE
允許並發查詢,阻止其他 DML/DDL
4Share (S)兼容 1,2CREATE INDEX
LOCK TABLE ... IN SHARE MODE
阻止 DML,允許查詢
5S/Row-X (SRX) / Share Sub Exclusive兼容 1FK 父表 UPDATE/DELETE (需鎖定子表)
LOCK TABLE ... IN SHARE ROW EXCLUSIVE MODE
阻止其他 DML/DDL,僅允許查詢
6Exclusive (X)全不兼容ALTER TABLE/DROP/TRUNCATE
LOCK TABLE ... IN EXCLUSIVE MODE
完全獨佔,阻塞所有操作

關鍵規律

  • 數字越大,級別越高,阻塞面越廣
  • DML (INSERT/UPDATE/DELETE) = Mode 3 (RX) — 這是業務最常見的鎖
  • SELECT ... FOR UPDATE = Mode 2 (RS) — 行級鎖,允許並發查詢
  • DDL = Mode 6 (X) — 必須獨佔
  • 外鍵級聯 = Mode 4/5 — 父表操作需鎖定子表防孤兒行

二、 鎖診斷標準查詢 (DBA 角色)

-- 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 早於業務高峰 → 疑似棄置連接

三、 標準解決流程:殺會話 (而非殺進程)

1. 數據庫級殺會話 (推薦、安全、精準)

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
-- IMMEDIATE: 立即回滾事務、釋放鎖、標記會話為 KILLED,客戶端下次操作報 ORA-00028

2. 進程級殺進程 (僅限極端情況、需極謹慎)

-- 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 -9 OS 進程?

維度KILL SESSIONKILL -9 OS PROCESS
事務回滾SMON 自動回滾,保證一致性事務中斷,SMON 需額外恢復,耗時不可控
鎖釋放即時、完整可能殘留鎖結構,需 PMON 清理
會話清理幹淨,資源正常釋放可能導致共享內存碎片、連接池感知延遲
影響面單會話一個 OS 進程可能服務多個會話 (共享服務器/DRCP),誤傷範圍大

四、 常見鎖爭用場景與預防

五、 死鎖自動處理機制

  • Oracle 自動檢測死鎖 (等待圖環路),選擇代價最小的會話 (Undo 量最少) 作為犧牲者,回滾其事務,返回 ORA-00060。
  • 應用層捕獲 ORA-00060 後應重試整個事務,而非單語句。
  • 死鎖 Trace 文件位置:USER_DUMP_DEST / DIAGNOSTIC_DEST,文件名含 _ora__.trc。

六、 總結

鎖診斷核心:**查 v$locked_object + v$session 定位會話 → 看 locked_mode/sql_text 判斷業務 → ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE 釋放**。堅決杜絕 OS kill -9,建立「長事務預警、外鍵必索引、連接池驗證」三大預防機制,將鎖故障降至最低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景特徵優化方案
熱點行更新多會話 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