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.