想了解更多可以看看文档或是TOM的9I&10G编程艺术这本书,我也是从上面摘下的一点。
当表或者进程被某一程序死锁之后,就无法对其进行操作,只有等待,有时等待session超时也可以进行操作,可有时session无法释放,就不能说,等一会可以解决问题的。
具体来说,解决办法有以下几点:
1、 首先使用system用户用plsql进行登陆,在tool->session,你就可以看到是那个程序锁定了那些表。
2、 或者使用以下语句进行查询也可(必须使用system用户)
以下的语句可以查询到谁锁了表,而谁在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
在查询结果里面,我们可以看到sid和serial#。
我们回到第一个步骤,对应sid和serial#就可以查询到那个session,点击右键选择kill即可。
3、 如果按上两个步骤还是不能解决死锁,则需要从操作系统级别上解决。
使用一下语句,查看操作系统级的进程id(即spid)
select b.logon_time,b.program,b.username,b.osuser,a.spid,b.sid,
b.serial#,b.logon_time,b.machine
from v$process a,v$session b
where a.addr=b.paddr
and b.sid=14
将b.sid=14换成在步骤2里面查询到的sid即可查询到该session的进程号,进入操作系统
使用 kill –9 spid 杀死进程,这样,死锁问题就很快解决了。