Oracle
 sql >> Database >  >> RDS >> Oracle

È possibile un deadlock durante l'aggiornamento e l'eliminazione di righe diverse in una tabella?

Se potessi aggiornare la tua domanda con il grafico dello stallo, sarebbe un'informazione utile. (Quando la tua applicazione incontra un deadlock, Oracle solleverà un ORA-00060 e un file di traccia verrà scritto in user_dump_dest.) Se guardi nel file di traccia, troverai una sezione chiamata "Grafico di deadlock". Se puoi pubblicarlo e pubblicare anche la dichiarazione che ha causato lo stallo e altre dichiarazioni coinvolte nello stallo, allora possiamo iniziare a trarre alcune conclusioni. (Tutte le informazioni che ho richiesto sono disponibili nel file di traccia.)

Come accennato da Alessandro, è possibile che le sessioni blocchino righe diverse nella stessa tabella in deadlock a causa di chiavi esterne non indicizzate nella tabella figlio di una relazione padre/figlio. Inoltre, è possibile che tu possa avere deadlock su due sessioni che aggiornano righe diverse della stessa tabella, anche se la tabella non fa parte di una relazione padre/figlio, se, ad esempio, la tabella ha una carenza di voci ITL.

Ancora una volta, pubblica le informazioni richieste sopra e sono sicuro che possiamo determinare la causa principale del tuo deadlock.

Aggiunto il 30/07/2012 **

Aggiungendo quanto segue, ora che il file di traccia del deadlock è stato fornito:Ok, prima di tutto, in base al contenuto del file di traccia, questo è un semplice deadlock dovuto alla sovrapposizione/collisione delle sessioni sulle righe che stanno cercando di bloccare. Nonostante i tuoi commenti precedenti sullo stallo fossero diversi righe, sono qui per dirti che questo particolare deadlock è dovuto al blocco a livello di riga sullo stesso righe.

Il fatto che il grafico del deadlock mostri che la modalità in cui è mantenuto il blocco è "X" (esclusiva) e la modalità in cui il blocco è in attesa è "X", mi dice che si tratta di un semplice blocco a livello di riga.

In questo caso, SID 20 sta eseguendo "cancella da RPT_TABLE.TEMP_TABLE_T1 dove TEMP_T1_ID=:1" e ha già un blocco su Rowid AAAPDIAAMAAAEfIAAA.

Nel frattempo, SID 790 sta eseguendo "RPT_TABLE.T1_UPDATE_StoredProc", mentre tiene già un blocco su rowid AAAPDIAAMAAAEfGAAA.

Nota dalla sezione "Righe in attesa" del file di traccia, che SID 20 è in attesa sulla riga che contiene SID 790 e SID 790 è in attesa sulla riga che contiene SID 20. Questo è un classico punto morto.

Alcune informazioni aggiuntive:

  • Il tipo di coda è TX (vedi il grafico del deadlock), quindi questo è sicuramente non blocco dovuto a chiavi esterne non indicizzate. Se fosse bloccato a causa di FK non indicizzati, il tipo di coda sarebbe TM, non TX. (C'è almeno un altro caso in cui sono coinvolti gli accodamenti TM e non si tratta di FK non indicizzati. Quindi, non dare per scontato che accodamento TM significhi sempre FK non indicizzati.)

  • La modalità in cui il blocco è in attesa è "X" (esclusivo), quindi questo è il blocco a livello di riga. Se la modalità in attesa era "S" (condivisa), allora non essere il blocco a livello di riga. Piuttosto, potrebbe essere la carenza di ITL o l'applicazione della PK o del Regno Unito.

Spero di esserti stato d'aiuto!