ORACLE查询通用查询被锁对象以及解锁方案
程序员文章站
2022-06-02 12:19:24
...
锁表锁存储过程遇到过好多次,有的是代码漏洞,没有回滚事物;有的时候就是网不好,存储过程调试着就断了,关了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';
上一篇: 慢查询日志
下一篇: ORACLE 事务并发-锁