Es imposible desconectarse de una base de datos Oracle sin comprometer o retroceder. Es posible que la aplicación del cliente se bloquee o se haya cancelado por la fuerza y no haya podido cerrar la sesión dejando una sesión en el servidor que tiene algunos bloqueos. Si ese es el caso, el DBA tendría que matar esa sesión.
Si usted es el DBA y no estás seguro de lo que la sesión tiene que ser matado, puede ejecutar la siguiente consulta para obtener información acerca de las distintas sesiones que mantengan bloqueos que están bloqueando otras sesiones
SELECT ses.sid, ses.serial#, ses.username, ses.program, ses.osuser, ses.machine
FROM v$session ses,
dba_blockers blk
WHERE blk.holding_session = ses.sid
una vez que haya identificado qué sesión (s) para matar
ALTER SYSTEM KILL SESSION '<<sid>>, <<serial#>>'
Gracias @JustinCave por su respuesta. Para aclarar, si la sesión no se termina de manera explícita, ¿nunca terminará automáticamente? –
@RussellSilva - Depende de lo que quiera decir con "automático". Si la aplicación del cliente falla, puede habilitar la detección de conexión muerta (DCD) en el servidor de la base de datos. Esto ocasionará que la base de datos haga ping periódicamente al cliente para determinar si aún está activo y matar la sesión si el cliente se ha bloqueado. Eso sucede relativamente rápido, sin embargo, por lo que no estaba relacionado con la pregunta original. Puede configurar Oracle para matar sesiones si están inactivas demasiado tiempo. En cualquiera de estos casos, la sesión se termina de forma explícita con un 'rollback', simplemente se termina por la base de datos. –