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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top