volte lunga coda per i blocchi di riga Oracle
-
19-09-2019 - |
Domanda
Continuo a correre in "enq: TX - fila contesa dei blocchi", quando si esegue il comando SQL di seguito in un Oracle DB 9. La mytable tavolo è un tavolino, con meno di 300 linee.
UPDATE MYTABLE
SET col1 = col1 + :B3 ,
col2 = SYSDATE
WHERE :B2 = col3
AND :B1 = col4
Corro 10 thread contemporaneamente, e un po 'aspettare fino a 10 secondi per avere la possibilità di aggiornare. So che affrontare questi problemi di stallo, ma il problema per me è che essi dovrebbero essere in grado di essere molto più veloce, dal momento che il tavolo è piccola, quindi l'aggiornamento sarebbe veloce.
modifica : io non può modificare questo codice, si trova all'interno di un'applicazione di terze parti. Posso modificare solo il DB.
cosa posso fare per migliorare la velocità della coda rowlock? Come posso migliorare questo tempo di attesa così i miei discussioni correre più veloce?
Soluzione
Se non si desidera essere bloccato non cercare di aggiornare alla cieca . Eseguire un SELECT PER UPDATE NOWAIT prima. Se si alza un'eccezione (ORA-00054) questo significa che un'altra sessione sta attualmente lavorando con quella riga. In tal caso, a seconda della vostra esigenza, si potrebbe tentare di aggiornare un'altra riga (stai cercando di costruire un processo di coda / dequeue?), Attendere (dbms_lock.sleep) o restituire un messaggio di errore per l'applicazione chiamante.
Avrete non di fronte a una situazione di stallo se si blocca la riga con FOR UPDATE NOWAIT prima.