Oracle
 sql >> Base de données >  >> RDS >> Oracle

Besoin d'aide pour comprendre le comportement de SELECT ... FOR UPDATE provoquant un blocage

La table USER a probablement beaucoup de clés étrangères qui y font référence. Si l'un d'entre eux n'est pas indexé, Oracle verrouille l'intégralité de la table enfant pendant qu'il supprime la ligne de la table parent. Si plusieurs instructions s'exécutent en même temps, même pour un utilisateur différent, les mêmes tables enfants seront verrouillées. Étant donné que l'ordre de ces opérations récursives ne peut pas être contrôlé, il est possible que plusieurs sessions verrouillent les mêmes ressources dans un ordre différent, provoquant un blocage.

Voir cette section dans le manuel Concepts pour plus d'informations.

Pour résoudre ce problème, ajoutez des index à toutes les clés étrangères non indexées. Si les noms de colonne sont standard, un script comme celui-ci pourrait vous aider à trouver des candidats potentiels :

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