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

Hai bisogno di aiuto per comprendere il comportamento di SELECT... FOR UPDATE che causa un deadlock

La tabella USER probabilmente ha molte chiavi esterne che si riferiscono ad essa. Se qualcuno di essi non è indicizzato, Oracle bloccherà l'intera tabella figlio mentre elimina la riga dalla tabella padre. Se più istruzioni vengono eseguite contemporaneamente, anche per un utente diverso, le stesse tabelle figlio verranno bloccate. Poiché l'ordine di tali operazioni ricorsive non può essere controllato, è possibile che più sessioni bloccheranno le stesse risorse in un ordine diverso, causando un deadlock.

Vedi questa sezione nel Manuale dei concetti per ulteriori informazioni.

Per risolvere questo problema, aggiungi indici a qualsiasi chiave esterna non indicizzata. Se i nomi delle colonne sono standard, uno script come questo potrebbe aiutarti a trovare potenziali candidati:

--Find un-indexed foreign keys.
--
--Foreign keys.
select owner, table_name
from dba_constraints
where r_constraint_name = 'USER_ID_PK'
    and r_owner = 'THE_SCHEMA_NAME'
minus
--Tables with an index on the relevant column.
select table_owner, table_name
from dba_ind_columns
where column_name = 'USER_ID';