oracle 查锁 杀锁 批量处理锁

oracle 查锁 杀锁 批量处理锁

今天开发同事代码bug,导致数据库多张表被锁,我又重新复习了下oracle杀锁,并记录下来

 author:石鲁坤

查询数据库锁的情况,使用具有DBA权限账户或者system账户执行

单个锁或者少许锁

SELECT l.session_id sid,
       s.serial#,
       l.locked_mode,
       l.oracle_username,
       s.user#,
       l.os_user_name,
       s.machine,
       s.terminal,
       a.sql_text,
       a.action
FROM v$sqlarea a, v$session s, v$locked_object l
WHERE l.session_id = s.sid AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;


--kill session语句
alter system kill session'50,492';

或者用下面语句
查看被锁的表


SELECT p.spid, a.serial#, c.object_name, b.session_id, b.oracle_username,b.os_user_name
 FROM v$process p, v$session a, v$locked_object b, all_objects c
 WHERE p.addr = a.paddr 
 AND a.process = b.process
 AND c.object_id = b.object_id
查看是哪个进程锁的 
SELECT sid, serial#, username, status, osuser FROM v$session  where serial# = '11016'


 
杀掉这个进程  

alter system kill session '72,11016';


如果锁比较多,使用批量解锁


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;

执行输出结果就行了

同时记录下,锁的5种情况

Oracle五种表级排他锁的总结和归纳

Oracle的五种表级锁很容易弄混,下面介绍这如果一个事务拥有五种锁,各种情况的权限和对其他事务的约束。

锁的名称

对其它事务的约束

拥有此锁的事务的权利

其他事务的权利

加锁语句

共享锁

(Share Table Lock,S)

允许其他事务对同一表上加共享锁

当一个表只有一个共享锁时,拥有此锁的事务可以进行数据更新操作(比如insert ,update等),但多个事务都对同一个表拥有共享锁时,任何一个事务都只能进行select操作。

只能进行select操作

Lock Table TableName In Share Mode;

排他所

(Exclusive Table Lock,X)

不允许其他事务对同一表进行任何加锁操作

拥有锁的事务可以进行表的任何操作

只能进行select操作

Lock Table TableName In Exclusive Mode;

行级共享锁

(Row Share Table Lock,RS)

不允许其他事务进行同一表上加排他锁(这是因为排他锁本身的特性:本来加了排他锁的事务就不允许其他事务对同一表加任何锁)

拥有更新权

允许其他事务的更新权。

SELECT . . . FROM TableName. . . FOR UPDATE OF . . . ;

Lock Table TableName In Share Row Mode;

行级排他锁

(Row Exclusive Table Lock,RX)

允许其他事务进行同一表的其他行加行排他和行共享锁;不允许其他事务对加共享锁或排他所

拥有更新权

其他事务拥有更新权

INSERT INTO TableName. . . ;

UPDATE TableName. . . ;

DELETE FROM TableName. . . ;

LOCK TABLE TableName IN ROW EXCLUSIVE MODE;

共享行排他

(Share Row Exclusive Table Lock,SRX)

不允许其他事务进行同一表的任何列加行排他锁,只能加行共享

锁的拥有事务对表有更新权

其他事务只有查询权

Lock Table TableName In Share Row Exclusive Mode;

猜你喜欢

转载自blog.csdn.net/shilukun/article/details/82796517