欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 解锁