Desbloquear un objeto de BBDD

Para probar esto, realizaremos un insert en una tabla y no realizaremos el commit, al intentar borrarla desde otra sesión nos devolverá  un error tipo:

ORA-00054: resource busy and acquire with NOWAIT specified

Esta select nos devolverá las tablas que están bloqueadas. 

SELECT

decode(L.TYPE,’TM’,’TABLE’,’TX’,’Record(s)’) TYPE_LOCK,

decode(L.REQUEST,0,’NO’,’YES’) WAIT,

S.OSUSER OSUSER_LOCKER,

S.PROCESS PROCESS_LOCKER,

S.USERNAME DBUSER_LOCKER,

O.OBJECT_NAME OBJECT_NAME,

O.OBJECT_TYPE OBJECT_TYPE,

concat( ,s.PROGRAM) PROGRAM,

O.OWNER OWNER,

s.SID,

s.serial#

FROM v$lock l,dba_objects o,v$session s

WHERE l.ID1 = o.OBJECT_ID

AND s.SID =l.SID

           AND l.TYPE in (TM’,’TX’)

Lo desbloquearemos de las siguientes maneras, con el SID y SERIAL# que hemos recuperado anteriormente: 

1. ALTER SYSTEM DISCONNECT SESSION SID, SERIAL#’ IMMEDIATE;
2. ALTER SYSTEM KILL SESSION SID, SERIAL#’ IMMEDIATE;

En el caso de que no finalice el proceso podemos matarlo desde el SO:  

3. kill -9 SPID. Donde el SPID lo podemos obtener en esta consulta:  

select substr(a.os_user_name,1,8) “OS User”

, substr(b.object_name,1,30) “Object Name”

, substr(b.object_type,1,8) “Type”

, substr(c.segment_name,1,10) “RBS”

, e.process “PROCESS”

, substr(d.used_urec,1,8) “# of Records”

, e.sid

, e.serial#

, p.*

from v$locked_object a

, dba_objects b

, dba_rollback_segs c

, v$transaction d

, v$session e

, v$process p

where a.object_id = b.object_id

and a.xidusn = c.segment_id

and a.xidusn = d.xidusn

and a.xidslot = d.xidslot

and d.addr = e.taddr

and p.addr = e.paddr

and substr(b.object_name,1,30)=NOMBRE_TABLA

Artículos relaccionados