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

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s