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.