martes, 13 de mayo de 2014

Encontrar y matar sesiones bloqueadas

El bloqueo de sesiones se producen cuando uno o mas sesiones sostiene un bloqueo exclusivo sobre un objeto y no lo libera antes de que otra sesión quiera actualizar los mismos datos. Esto bloqueará el segundo hasta que el primero ha hecho su trabajo. 

Desde el punto de vista del usuario  lo que verá  sera como la aplicación se cuelga por completo y estará a la espera hasta que  la primera sesión libere su bloqueo. A menudo se tiene que identificar estas sesiones con el fin de mejorar su aplicación para evitar el mayor número de sesiones de bloqueo posible.

Podemos encontrar las sesiones bloqueadas con el siguiente script el cual esta buscando los objetos que empiecen con MTL.

select a.object_name, b.ORACLE_USERNAME, b.SESSION_ID
from   all_objects a, v$locked_object b
where  a.OBJECT_ID = b.OBJECT_ID
and a.object_name like 'MTL%'

order by session_id asc

Ejecutando en base de datos nos saldrá lo siguiente: 



Ahora si queremos matar una sesión de una de las tablas podemos realizar lo siguiente:

DECLARE
    CURSOR c IS
    SELECT c.owner,
          c.object_name,
          c.object_type,
          b.SID,
          b.serial#,
          b.status,
          b.osuser,
        b.machine
    FROM v$locked_object a, v$session b, dba_objects c
    WHERE b.SID = a.session_id AND a.object_id = c.object_id
    and c.object_name in ('MTL_SYSTEM_ITEMS_INTERFACE');
   c_row c%ROWTYPE;
   l_sql VARCHAR2(100);
   BEGIN
   OPEN c;
   LOOP
   FETCH c INTO c_row;
   EXIT WHEN c%NOTFOUND;
   l_sql := 'alter system kill session '''||c_row.SID||','||c_row.serial#||'''';
   EXECUTE IMMEDIATE l_sql;
   END LOOP;
   CLOSE c;
   END;

Una ves ejecutado la sesión ha sido eliminada y la tabla ya no estara bloqueada.

No hay comentarios:

Publicar un comentario