Enqueues (TM) : 5 = 3 + 4

Parfois on se pose des questions qu’on ne devrait pas. Les noms des différents niveaux de verrous Oracle sur une table (TM) en fait peut-être partie ! Autrement dit, la signification des colonnes LMODE et REQUEST de la vue GV$LOCK dans le cas TYPE='TM'. Mais, commencons par ce qui est facile à remplir… C’est à dire la documentation ou la documentation et quelques tests très simples ; vous arriverez facilement à la conclusion que :

  • 2: RS ou SS
  • 3: RX ou SX
  • 4: S
  • 5: SRX ou SSX
  • 6: X

Il manquent donc 2 valeurs dans ce tableau : 0 et 1 ; partons à leur recherche…

Exemple 1 : un enqueue 4

Créons une table pour nos tests :

create table t1(id number);
insert into t1 values (1);
commit;

Pour simuler un enqueue S, rien de plus simple :

lock table t1 in share mode; 

select type, id1, id2, lmode, request
from v$lock
where sid=sys_context('USERENV','SID');

TY ID1 ID2 LMODE REQUEST
-- ---------- ---------- ---------- ----------
AE 100 0 4 0
TM 13335 0 4 0

rollback;

Exemple 2 : un enqueue 0

Pour ce second exemple, il vous faut 2 sessions; la première pose un verrou X comme ceci :

lock table t1 in exclusive mode; 

select type, id1, id2, lmode, request
from v$lock
where sid=sys_context('USERENV','SID');

TY ID1 ID2 LMODE REQUEST
-- ---------- ---------- ---------- ----------
AE 100 0 4 0
TM 74443 0 6 0

Connectez-vous dans une seconde session sans valider ou annuler le verrou X de la première et repérez la session avant de tenter de poser un enqueue sur la table :

select sys_context('USERENV','SID') sid
from dual;

SID
----
144

insert into t1 values (2);

Revenez dans la première session et interroger le mode de l’enqueue TM de la session sid=144 (dans mon cas !)… vous trouverez 0 :

select type, id1, id2, lmode, request
from v$lock
where sid=144;

TY ID1 ID2 LMODE REQUEST
-- ---------- ---------- ---------- ----------
AE 100 0 4 0
TM 74443 0 0          3

rollback;

Exemple 3 : un enqueue 5

Je vous propose donc de trouver le sens de la valeur 5 ; rien de plus simple :

insert into t1 values (1);

select type, id1, id2, lmode, request
from v$lock
where sid=sys_context('USERENV','SID');

TY ID1 ID2 LMODE REQUEST
-- ---------- ---------- ---------- ----------
AE 100 0 4 0
TM 13335 0 3 0
TX 196617 322 6 0

lock table t1 in share mode;

select type, id1, id2, lmode, request
from v$lock
where sid=sys_context('USERENV','SID');

TY ID1 ID2 LMODE REQUEST
-- ---------- ---------- ---------- ----------
AE 100 0 4 0
TM 13335 0 5 0
TX 196617 322 6 0

CQFD#

Moralité

Dans mon monde 0 = n + 6 (si 6 est dans une autre session) alors que 5 = 3 + 4 (dans la même session) ; drôle de monde ?

2 réflexions sur “Enqueues (TM) : 5 = 3 + 4”

  1. Effectivement, les codes ne signifient rien. C’était de l’auto-dérision ! Ca n’a pas l’air auto dérisoire B-).

    EXCELLENT article au fait ! J’aurais mieux fait de le lire avant d’écrire mes conneries…

    Au fait. je n’ai pas encore trouvé WHERE LMODE=1 AND TYPE=’TM’ ?

    Ce qui me fait penser que tes articles sont aussi bien quand ce sont des originaux que quand il s’agit de traduction. Après tous, personne ne t’attends vraiment pour lire les articles de Tom Kyte ou Jonathan Lewis, si ? Et d’ailleurs : qui fait de l’Oracle et ne parle pas anglais ?

  2. Bonjour,

    Je ne pense pas q’il y ait vraiment d’arithmétique liée au mode (sauf 0 qui correspond à l’absence de verrou). C’est juste un identifiant numérique. Il y a bien un certain ordre dans les numéros, mais pas toujours: par exemple S (4) n’est pas plus restrictif (ni moins) que RX (3)

    Sur les noms, j’avais essayé de décrire leur sens ici.
    Eux, ils ont vraiement un sens: l’exemple 3 montre que S+SX=SSX

    Cordialement,
    Franck.

Les commentaires sont fermés.