En este artículo veremos como 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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