Otra de las cosas que mas amenudo tenemos que hacer es el encontrar quien nos está bloqueando y que bloquea.
Para ello, la consulta mas sencilla que podemos hacer es:
SELECT
a.session_id , username ,type , mode_held, mode_requested
lock_id1,lock_id2
FROM
sys.v_$session b,
sys.dba_blockers c,
sys.dba_lock a
WHERE
c.holding_session=a.session_id AND
c.holding_session=b.sid
Pero, seguramente queramos saber mas cosas, como que tipo de bloqueos y que objetos están implicados, para ello podemos usar esta consulta en la que aparecen datos de la sesión, del proceso tanto en el server como en el cliente y de los objetos y tipo de bloqueo que lleva a cabo
SELECT
substr(to_char(l.sid),1,4) "SID",
s.serial# "SERIAL",
P.spid "Server PID",
s.USERNAME,
s.type,
s.process "Client PID",
MACHINE,
l.type,
DECODE(L.TYPE,'MR','File_ID: '||L.ID1,
'TM', LO.NAME,
'TX','USN: '||to_char(TRUNC(L.ID1/65536))||' RWO: '||nvl(RWO.NAME,'None'),L.ID1) LOCK_ID1,
decode(l.lmode,
0, 'None',
1, 'Null',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share',
5, 'S/Row-X (SSX)',
6, 'Exclusive',
substr(to_char(l.lmode),1,13)) "Locked Mode",
decode(l.request,
0, 'None',
1, 'Null',
2, 'Row-S (SS)',
3, 'Row-X (SX)',
4, 'Share',
5, 'S/Row-X (SSX)',
6, 'Exclusive',
substr(to_char(l.request),1,13)) "Requested",
l.ctime,
l.block ,
s.logon_time
FROM v$process P,
v$session S,
v$lock l,
sys.obj$ lo,
sys.obj$ rwo
WHERE l.sid = S.sid (+)
AND S.paddr = P.addr (+)
AND LO.OBJ#(+) = L.ID1
AND RWO.OBJ#(+) = S.ROW_WAIT_OBJ#
and S.type!='BACKGROUND'
order by SID;