Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Benötigen Sie Hilfe beim Verständnis des Verhaltens von SELECT ... FOR UPDATE, das einen Deadlock verursacht

Die USER-Tabelle enthält wahrscheinlich viele Fremdschlüssel, die darauf verweisen. Wenn einer von ihnen nicht indiziert ist, sperrt Oracle die gesamte untergeordnete Tabelle, während es die Zeile aus der übergeordneten Tabelle löscht. Wenn mehrere Anweisungen gleichzeitig ausgeführt werden, selbst für einen anderen Benutzer, werden dieselben untergeordneten Tabellen gesperrt. Da die Reihenfolge dieser rekursiven Operationen nicht kontrolliert werden kann, ist es möglich, dass mehrere Sitzungen dieselben Ressourcen in einer anderen Reihenfolge sperren, was zu einem Deadlock führt.

Siehe diesen Abschnitt im Concepts-Handbuch für weitere Informationen.

Um dies zu beheben, fügen Sie allen nicht indizierten Fremdschlüsseln Indizes hinzu. Wenn die Spaltennamen Standard sind, könnte Ihnen ein Skript wie dieses dabei helfen, potenzielle Kandidaten zu finden:

--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';