Oracle Data Table Lock

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}’;