當兩個或多個 Session 互相持有對方需要的鎖資源,形成循環等待,Oracle 會自動偵測並拋出 ORA-00060,犧牲其中一個交易回滾。但鎖持有者可能仍佔用資源,需 DBA 介入清理。
SELECT * FROM v$db_object_cache WHERE owner = 'SCOTT' AND locks != '0';
記下 NAME (物件名)、TYPE。
SELECT sid FROM v$access WHERE owner = 'SCOTT' AND name = '被鎖物件名';
SELECT s.sid, s.serial#, p.spid FROM v$session s, v$process p WHERE s.paddr = p.addr AND s.sid = :上一步查到的_SID;
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;ORAKILL SID SPIDkill -9 SPIDSET LINES 200 PAGES 1000
COL kill_db FOR A60
COL kill_os FOR A60
SELECT 'ALTER SYSTEM KILL SESSION ''' || s.sid || ',' || s.serial# || ''' IMMEDIATE;' AS kill_db,
'ORAKILL ' || s.sid || ' ' || p.spid AS kill_os -- Windows
-- 'kill -9 ' || p.spid AS kill_os -- Linux
FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.sid IN (
SELECT sid FROM v$access
WHERE owner = UPPER('&OWNER') AND name = UPPER('&OBJECT_NAME')
);
SELECT blocking_session, sid, serial#, event, seconds_in_wait FROM v$session WHERE blocking_session IS NOT NULL;
COMMIT。SELECT ... FOR UPDATE NOWAIT 或 SKIP LOCKED (11g+) 非阻塞鎖定。