oracle如何解除死锁[进程互相锁死]

oracle如何解除死锁[进程互相锁死]
data directory:v$session,v$lock
1  rem 查询目前正在等待锁资源的用户
select a.username,a.sid,a.serial#,b.id1 from v$session a, v$lock b
where a.lockwait=b.kaddr

USERNAME                              SID    SERIAL#        ID1
------------------------------ ---------- ---------- ----------
TEST                                  143         27     196632

2  rem 查询锁住其它用户进程
select a.username,a.sid,a.serial#,b.id1 from v$session a,v$lock b
where b.id1 in
(select distinct e.id1
from v$session d,v$lock e
where d.lockwait=e.kaddr)
and a.sid=b.sid
and b.request=0;

USERNAME                              SID    SERIAL#        ID1
------------------------------ ---------- ---------- ----------
TEST                                  159          5     196632

3  上述两次查询说明ID1同为196632的会话中 ‘159,5’锁住了会话‘143,27’。
rem 强制将锁进程解开:alter system kill session 'SID,SERIAL#'
alter system kill session '159,5';

将锁进程解开后,会要求用户执行commit或rollback命令,使事物终结。

附:模拟死锁产生
1 rem 测试表数据t2内容如下:
select * from t2;
ID
----------
1
2
3
2 seesion 1:
rem 更新第一条数据
update t2 set id='11' where id='1';
session 2
rem 更新第二条数据
update t2 set id='22' where id='2';
3 session 1
rem 更新第二条数据
update t2 set id='22' where id='2';
session 1
rem 更新第一条数据
update t2 set id='11' where id='1';

第2、3步做完后,将会产生死锁。
采取上述解锁的方法,可解除死锁。
参考:《oracle9i数据库管理员使用大全》

你可能感兴趣的:(oracle)