我们通常在定位数据库锁问题时,通常希望找到哪个进程发出了哪个语句,锁住了哪张表,一般我们通过查v$lock,然后找到sid,再到v$sesion里找到这个进程的hash_value或pre_hash_value,然后根据hash_value定位到具体的语句。
可是,我们发现,通过JDBC连接上来的进程,它的hash_value是0,所以我们就无法定位这个进程执行的语句了,不过在oracle 10g之后,在v$session里面多了个sql_id字段,我们可以通过这个字段来查具体语句。在9i及之前的版本就没办法了。开了个oracle服务请求,oracle工程师也没有给出答案。提供一下语句:
10g之后,可以:
col sess format a15;
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
id1, id2, lmode, request, type,block,ctime
FROM V$LOCK
WHERE (id1, id2, type) IN
(SELECT id1, id2, type FROM V$LOCK WHERE request>0)
ORDER BY id1, request;
/
select sql_text from v$sqlarea where sql_id in
(select sql_id from v$session where sid=&1);