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