Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Precisa de ajuda para entender o comportamento de SELECT ... FOR UPDATE causando um deadlock


A tabela USER provavelmente tem muitas chaves estrangeiras referentes a ela. Se algum deles não estiver indexado, o Oracle bloqueará toda a tabela filha enquanto exclui a linha da tabela pai. Se várias instruções forem executadas ao mesmo tempo, mesmo para um usuário diferente, as mesmas tabelas filhas serão bloqueadas. Como a ordem dessas operações recursivas não pode ser controlada, é possível que várias sessões bloqueiem os mesmos recursos em uma ordem diferente, causando um deadlock.

Consulte esta seção no manual de Conceitos para obter mais informações.

Para resolver isso, adicione índices a qualquer chave estrangeira não indexada. Se os nomes das colunas forem padrão, um script como este pode ajudá-lo a encontrar possíveis 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';