ORACLE – enq: TX row lock contention

Enqueues sono lock che coordinano l'accesso alle risorse del database.
Enq-wait event indica che la sessione è in attesa di un lock tenuto da un'altra sessione. Se la quantità di tempo di attesa associato all'evento attesa è eccessiva potrebbe essere responsabile di problemi prestazionali.
TX enqueue sono acquisiti in esclusiva quando una transazione effettua la prima modifica e sono tenuti fino a quando la transazione non effettua commit o rollback.
– Alcune situazioni di TX enqueue:
– La modalità 6 si verifica quando una sessione è in attesa di un blocco a livello di riga che è già detenuto da
un'altra sessione.
Ciò si verifica quando un utente sta aggiornando o cancellando una riga e un’altra sessione richiede lo stesso tipo di operazioni su quel dato.
Questo tipo di attesa su TX enqueue corrisponde all’attesa sull’evento TX – row lock contention.
Per risolvere questo problema la prima sessione che già detiene il blocco dovrebbe eseguire una commit o rollback.
– La modalita’ 4 si verifica quando una sessione rimane in attesa causa di potenziali duplicati su un indice univoco.
Se due sessioni tentano di inserire lo stesso valore chiave, la seconda sessione deve aspettare per vedere se un errore ORA-0001 viene evidenziato.
– Questo tipo di attesa su TX enqueue corrisponde all’attesa sull’evento TX – Row lock contention.
Per risolvere questo problema la prima sessione che già detiene il blocco dovrebbe eseguire una commit o rollback.
– Un’altra condizione di modalita’ 4 può verificarsi anche quando più sessioni tentano di aggiornare o eliminare righe diverse che sono protetti dalla stessa bitmap entry. Naturalmente questo non si applica se non si fa uso di indici bitmap.
A differenza della entry di un indice B-tree, che contiene un unico ROWID, una entry di bitmap può potenzialmente coprire una gamma di ROWIDs.
Così, quando una entry di indice bitmap è bloccata, tutte le ROWIDs che sono coperte da quella entry sono bloccate.
Troubleshooting:
For which SQL currently is waiting on:
select sid, sql_text from v$session s, v$sql q where sid in (select sid from v$session where state in
('WAITING') and wait_class != 'Idle' and event='enq: TX – row lock contention' and (q.sql_id =
s.sql_id or q.sql_id = s.prev_sql_id));
The blocking session is:
select blocking_session, sid, serial#, wait_class, seconds_in_wait from v$session where
blocking_session is not NULL order by blocking_session;

Potrebbero interessarti anche...