存儲過程處理大量數據時卡死,表被鎖定,但 V$SESSION/V$LOCK 查無阻塞會話,Kill 不了進程。
PRAGMA AUTONOMOUS_TRANSACTION) 或調用其他過程,導致鎖持有者非當前會話。TRUNCATE/CREATE INDEX 等 DDL,導致隱式提交,鎖釋放時機難預測。-- 1. 查找持有鎖的對象與會話(含遞歸)
SELECT s.sid, s.serial#, s.username, s.program, o.object_name, l.type, l.lmode, l.request
FROM v$session s
JOIN v$lock l ON s.sid = l.sid
JOIN dba_objects o ON l.id1 = o.object_id
WHERE l.request > 0 OR l.lmode > 0;
-- 2. 檢查 ITL 等待
SELECT * FROM v$session_wait WHERE event = 'enq: TX - allocate ITL entry';
-- 3. 查看長時間活躍事務
SELECT s.sid, s.serial#, t.used_ublk, t.start_time, s.sql_id
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr
WHERE t.used_ublk > 1000; -- 大量 undo 塊
COMMIT,避免單事務過大鎖表過久。ALTER TABLE t INITRANS 20; 預留更多 ITL 槽。V$SESSION_WAIT 記錄等待鏈,定位根因。