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.