Lorsqu’une requête en ajout, suppression ou modification est faite sur une table Oracle, un lock est posé pour éviter les mises à jour concurrentes avec d’autres requêtes. Si une instruction SQL rencontre un lock, elle est alors positionnée dans une liste d’attente et sera exécutée quand aucune autre instruction ne sera placée devant elle et qu’aucun lock ne sera présent sur la table.
La vue DBA_LOCKS permet de retrouver la situation de verrouillage:
SELECT SUBSTR(TO_CHAR(session_id),1,5) “SID”,
SUBSTR(lock_type,1,15) “Lock Type”,
SUBSTR(mode_held,1,15) “Mode Held”,
SUBSTR(blocking_others,1,15) “Blocking?”
FROM dba_locks
WHERE blocking_others =’Blocking’;
Le script suivant permet d’identifier rapidement les objets « lockés » dans le système Oracle
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;
On peut aussi voir la liste des taches en attentes via la vue DBA_WAITERS
select * from DBA_WAITERS;
Dans certains cas, même si c’est rare, les locks ne seront jamais détruits par Oracle. Cela se
traduit souvent par une requête anormalement longue car elle attend tout simplement la fin d’un
lock qui n’arrivera pas.
Solution :
La solution est alors de « killer » la session qui cause le blocage. Il faut avoir les droits nécessaires pour exécuter la requête suivante :
alter system kill session ‘{SID}’;