background success stories

Oracle: attente « enq: TX – row lock contention » sur un insert

On s’attend généralement à rencontrer des attentes de type « enq: TX – row lock contention » lorsque deux sessions concurrentes essaient de mettre à jour une même rangée existante d’une table, via des ordres update ou delete.

Il existe des cas particuliers où ces attentes se rencontrent lors d’insert de nouvelles rangées.

Cas 1: avec un index unique

Dans une session1, on crée une table avec un index unique et on insère une valeur sans faire de commit.

SQL-sess1> create table mytest (id number);
Table creee.

SQL-sess1> alter table mytest add constraint mytest_idx unique (id);
Table modifiee.

SQL-sess1> insert into mytest values (1);
1 ligne creee.

Dans une session2, on insère la même valeur dans la table; la session2 est bloquée.

SQL-sess2> insert into mytest values (1);
-

Sur la session1, on constate l’attente « enq: TX – row lock contention » de la session2.

SQL-sess1> select sid,blocking_session,event from v$session where lockwait is not null;
       SID BLOCKING_SESSION EVENT
----------------------------------------------------------------
       160              162 enq: TX - row lock contention

Sur la session1, on exécute le commit.

SQL-sess1> commit;
Validation effectuee.

Sur la session2, la session sort de son attente avec l’erreur de violation de contrainte.

SQL-sess2> insert into mytest values (1);
insert into mytest values (1)
*
ERREUR a la ligne 1 :
ORA-00001: violation de contrainte unique (SYS.MYTEST_IDX)

Cas 2: avec un index bitmap

Dans une session1, on crée une table avec un index bitmap et on insère une valeur sans faire de commit.

SQL-sess1> create table mytest(id number);
Table creee.

SQL-sess1> create bitmap index mytest_idx on mytest(id);
Index cree.

SQL-sess1> insert into mytest values(1);
1 ligne creee.

Dans une session2, on insère la même valeur dans la table; la session2 est bloquée.

SQL-sess2> insert into mytest values (1);
-

Sur la session1, on constate l’attente « enq: TX – row lock contention » de la session2.

SQL-sess1> select sid,blocking_session,event from v$session where lockwait is not null;
       SID BLOCKING_SESSION EVENT
----------------------------------------------------------------
       160              162 enq: TX - row lock contention

Sur la session1, on exécute le commit.

SQL-sess1> commit;
Validation effectuee.

Sur la session2, la session sort de son attente et effectue son insert.

SQL-sess2> insert into mytest values (1);
1 ligne creee.