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;