sql >> Base de Datos >  >> RDS >> Oracle

Necesita ayuda para comprender el comportamiento de SELECCIONAR ... PARA ACTUALIZAR que causa un interbloqueo

La tabla USER probablemente tiene muchas claves foráneas que se refieren a ella. Si alguno de ellos no está indexado, Oracle bloqueará toda la tabla secundaria mientras elimina la fila de la tabla principal. Si se ejecutan varias declaraciones al mismo tiempo, incluso para un usuario diferente, se bloquearán las mismas tablas secundarias. Dado que el orden de esas operaciones recursivas no se puede controlar, es posible que varias sesiones bloqueen los mismos recursos en un orden diferente, provocando un punto muerto.

Consulte esta sección en el manual Conceptos para obtener más información.

Para resolver esto, agregue índices a cualquier clave externa no indexada. Si los nombres de las columnas son estándar, un script como este podría ayudarlo a encontrar posibles candidatos:

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