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

Trovare la causa dell'errore deadlock dal file di traccia di Oracle

Prima di tutto, select istruzione non blocca mai nulla in Oracle, utilizza solo l'ultima versione coerente disponibile dei dati. Non è un caso per select ... for update che blocca dati come update da Oracle 9i, ma non ci sono for update clausola nella query dalla domanda.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

La sessione n. 72 contiene il blocco a livello di tabella (TM) con il tipo "Row Exclusive" (SX) e desidera acquisire il blocco "Share Row Exclusive" (SSX) sulla stessa tabella. Questa sessione è stata bloccata dalla sessione n. 24 che contiene già un blocco a livello di tabella dello stesso tipo (SX) e attende che il blocco SSX sia disponibile.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Questa (seconda riga) mostra esattamente la stessa situazione, ma nella direzione opposta:la sessione n. 24 attende che il blocco SSX diventi disponibile, ma è bloccata dalla sessione n. 72 che contiene già il blocco SX sulla stessa tabella.

Quindi, la Sessione #24 e la Sessione #72 si bloccano a vicenda:si verifica un deadlock.

Entrambi i tipi di lock (SX e SSX) sono lock a livello di tabella.
Per capire la situazione consiglio di leggere questo articolo di Franck Pachot.

Di seguito è riportata la citazione di questo articolo, direttamente pertinente alla tua situazione (nota che le abbreviazioni SSX e SRX sono equivalenti):

L'integrità referenziale acquisisce anche i blocchi TM. Ad esempio, il problema comune con le chiavi esterne non indicizzate porta a blocchi S sulla tabella figlio quando si esegue un'eliminazione o un aggiornamento sulla chiave nella tabella padre. Questo perché senza un indice, Oracle non ha una singola risorsa di livello inferiore da bloccare per impedire un inserimento simultaneo che possa violare l'integrità referenziale.
Quando le colonne della chiave esterna sono le colonne principali in un indice normale, la prima voce dell'indice con il valore genitore può essere utilizzato come una singola risorsa e bloccato con un TXlock a livello di riga.
E se l'integrità referenziale ha una cascata di eliminazione? Oltre alla modalità S, c'è l'intenzione di aggiornare le righe nella tabella figlio, come con la modalità Row X (RX). È qui che si verifica l'esclusiva riga di condivisione (SRX):S+RX=SRX.

Quindi, la variante più probabile è che la Sessione #72 e la Sessione #24 elimini alcune righe in EMPLOYEE table allo stesso tempo, e ci sono on delete cascade vincolo per EMPSAL_EMP_ID in concomitanza con l'assenza di indice su EMPLOYEE_SALARY tabella in cui EMPSAL_EMP_ID colonna elencata per prima.