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; |