oracle如何解除死锁[进程互相锁死]
程序员文章站
2022-07-14 10:07:33
...
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数据库管理员使用大全》
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数据库管理员使用大全》
上一篇: 手工创建数据库完整步骤