鎖定診斷三大核心視圖:
V$LOCKED_OBJECT:當前被鎖定的物件(含 SESSION_ID、LOCKED_MODE)DBA_OBJECTS:物件名稱、類型、OWNERV$SESSION:會話詳細資訊(SID、SERIAL#、用戶、機器、程式、SQL_ID)SELECT
lo.SESSION_ID AS sid,
s.SERIAL# AS serial,
lo.ORACLE_USERNAME AS db_user,
lo.OS_USER_NAME AS os_user,
ao.OBJECT_NAME AS locked_object,
ao.OBJECT_TYPE AS obj_type,
DECODE(lo.LOCKED_MODE,
0, 'None',
1, 'Null (NULL)',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share (S)',
5, 'S/Row-X (SSX)',
6, 'Exclusive (X)',
TO_CHAR(lo.LOCKED_MODE)
) AS lock_mode,
s.MACHINE,
s.TERMINAL,
s.PROGRAM,
s.SQL_ID,
s.PREV_SQL_ID
FROM V$LOCKED_OBJECT lo
JOIN DBA_OBJECTS ao ON ao.OBJECT_ID = lo.OBJECT_ID
JOIN V$SESSION s ON s.SID = lo.SESSION_ID
ORDER BY lo.SESSION_ID;
輸出關鍵欄位:SID、SERIAL#(殺會話必備)、LOCK_MODE(6=排他鎖最嚴重)、SQL_ID(可關聯 V$SQL 看完整語句)。
SELECT s.SID, s.SERIAL#, s.USERNAME, s.MACHINE, s.PROGRAM, lo.OBJECT_ID
FROM V$SESSION s
JOIN V$LOCKED_OBJECT lo ON lo.SESSION_ID = s.SID;
ALTER SYSTEM KILL SESSION 'sid,serial#';
KILLED,事務隱性回滾,鎖最終釋放。SELECT p.SPID, s.OSUSER, s.PROGRAM
FROM V$SESSION s
JOIN V$PROCESS p ON p.ADDR = s.PADDR
WHERE s.SID = :target_sid;
kill -9 <SPID>(需 root 或 oracle 用戶)orakill.exe
orakill <SID> <SPID>
-- 例:orakill ORCL 12345
注意:Windows 下 SPID 是**執行緒 ID**,不可用 Task Manager 的 PID,必須用上述查詢取得。
SELECT 'ALTER SYSTEM KILL SESSION ''' || s.SID || ',' || s.SERIAL# || ''';'
FROM V$LOCKED_OBJECT lo
JOIN V$SESSION s ON s.SID = lo.SESSION_ID;
⚠️ 警告:請逐條人工核對後執行,**嚴禁直接管道給 SQL*Plus 批量執行**,誤殺核心會話(如 PMON、SMON、備份進程)會導致資料庫掛起或重啟。
若多會話互相等待,需找到鏈條最上游的 Blocker:
SELECT
blocking_session AS blocker_sid,
s1.USERNAME AS blocker_user,
s1.SQL_ID AS blocker_sql,
s2.SID AS waiter_sid,
s2.USERNAME AS waiter_user,
s2.SQL_ID AS waiter_sql,
l.TYPE AS lock_type,
l.LMODE AS blocker_mode,
l.REQUEST AS waiter_mode
FROM V$LOCK l
JOIN V$SESSION s1 ON s1.SID = l.SID
JOIN V$SESSION s2 ON s2.SID = l.BLOCKING_SESSION
WHERE l.BLOCKING_SESSION IS NOT NULL
AND l.REQUEST > 0;
優先處理 BLOCKER_SID,連鎖釋放所有 Waiter。
SELECT ... FOR UPDATE NOWAIT/SKIP LOCKED:避免無限等待,應用層捕獲異常重試或提示用戶。V$SESSION_WAIT 中 EVENT = 'enq: TX - row lock contention' 且 SECONDS_IN_WAIT > 30 設定告警。鎖定診斷三步驟:**查全景(V$LOCKED_OBJECT)→ 找根因(Blocker 鏈)→ 精準殺(優雅優先、強制備援)**。工具是死的,判斷是活的;殺會話前請三思:是否可改為應用層重試?是否為長跑報表被批次作業阻擋?若頻發,才是架構與代碼該動刀時。