我个人对SQL锁也不是非常关注,但是毕竟也是IT内的一小角色;也不免要跟数据库打交道,我所谓说的打交道只是使用基本的操作,不像那些DB manger ;
更别提什么优化什么游标和表的索引了。对锁也是了解没有进一步关注,但是最近因为一些需要所以去查阅资料和网络及书籍也只是了解一个大致而已
想了解更多可以看看文档或是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 杀死进程,这样,死锁问题就很快解决了。