鎖表鎖存儲過程遇到過好多次,有的是代碼漏洞,沒有回滾事物;有的時候就是網不好,存儲過程調試着就斷了,關了PLSQL之後,那個session其實還在,就鎖死了,必須要手動殺死才行。之前有的項目還有這種情況,處理單據時,鎖住單據行,然後回滾的時候其實不是同一個數據庫連接對象,回滾了也沒有,更有甚者,拋出異常了沒有回滾,直接gg,鎖了好多行。
1、2比較簡單粗暴,療效也不錯
2、3比較穩,一個個確認後再殺死
1.查詢所有被鎖對象
SELECT SQL_TEXT
FROM V$SQL
WHERE HASH_VALUE IN
(SELECT SQL_HASH_VALUE
FROM V$SESSION
WHERE SID IN (SELECT SESSION_ID FROM V$LOCKED_OBJECT));
2.釋放所有被鎖對象
DECLARE
CURSOR MYCUR IS
SELECT B.SID, B.SERIAL#
FROM V$LOCKED_OBJECT A, V$SESSION B
WHERE A.SESSION_ID = B.SID
GROUP BY B.SID, B.SERIAL#;
BEGIN
FOR CUR IN MYCUR LOOP
EXECUTE IMMEDIATE ('alter system kill session ''' || CUR.SID || ',' ||
CUR.SERIAL# || ''' ');
END LOOP;
END;
3.查詢被鎖對象詳情
SELECT A.OWNER 方案名,
A.OBJECT_NAME 表名,
B.XIDUSN 回滾段號,
B.XIDSLOT 槽號,
B.XIDSQN 序列號,
B.SESSION_ID 鎖表SESSION_ID,
B.ORACLE_USERNAME 鎖表用戶名,
decode(D.type,
'XR',
'NULL',
'RS',
'SS(Row-S)',
'CF',
'SS(Row-S)',
'TM',
'TABLE LOCK',
'PW',
'TABLE LOCK',
'TO',
'TABLE LOCK',
'TS',
'TABLE LOCK',
'RT',
'ROW LOCK',
'TX',
'ROW LOCK',
'MR',
'S(Share)',
NULL) 鎖定方式,
C.MACHINE 用戶組,
C.TERMINAL 機器名,
B.OS_USER_NAME 系統用戶名,
B.PROCESS 系統進程id,
DECODE(C.STATUS, 'INACTIVE', '不活動', 'ACTIVE', '活動') 活動情況,
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM 連接方式,
C.LOGON_TIME
FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C, v$lock d
WHERE (A.OBJECT_ID = B.OBJECT_ID)
AND (B.PROCESS = C.PROCESS)
and C.sid = d.sid
and B.LOCKED_MODE = D.LMODE
ORDER BY 1, 2;
4.殺死session
alter system kill session '391';