Quand des utilisateurs signalent qu’un écran ou un traitement « ne répond plus », le premier contrôle côté Oracle consiste à vérifier si une session attend un verrou détenu par une autre.
Identifier les sessions bloquantes
La requête joint V$LOCK à elle-même : une session qui détient un verrou bloquant (block = 1) est rapprochée des sessions qui demandent la même ressource (request > 0, mêmes id1 / id2). Pour chaque couple, elle renvoie l’utilisateur base et l’utilisateur OS, ainsi que le sid, serial# des deux sessions.
SELECT
(select username || ' - ' || osuser from v$session where sid=a.sid) blocker,
a.sid || ', ' || (select serial# from v$session where sid=a.sid) sid_serial,
' is blocking ',
(select username || ' - ' || osuser from v$session where sid=b.sid) blockee,
b.sid || ', ' || (select serial# from v$session where sid=b.sid) sid_serial
FROM
v$lock a, v$lock b
WHERE
a.block = 1
AND b.request > 0
AND a.id1 = b.id1
AND a.id2 = b.id2;
Libérer le verrou
Une fois la session bloquante identifiée, le plus propre est de demander à son utilisateur de valider (commit) ou d’annuler (rollback). Si ce n’est pas possible, un DBA peut terminer la session à partir du sid, serial# obtenu :
ALTER SYSTEM KILL SESSION '<sid>,<serial#>' IMMEDIATE;
Le travail non validé de la session terminée est annulé, et les sessions en attente reprennent.