sql >> Databasteknik >  >> RDS >> Oracle

Behöver hjälp att förstå beteendet hos SELECT ... FÖR UPPDATERING som orsakar ett dödläge

Tabellen USER har förmodligen många främmande nycklar som refererar till den. Om någon av dem är oindexerad kommer Oracle att låsa hela den underordnade tabellen medan den tar bort raden från den överordnade tabellen. Om flera satser körs samtidigt, även för en annan användare, kommer samma underordnade tabeller att låsas. Eftersom ordningen på dessa rekursiva operationer inte kan kontrolleras är det möjligt att flera sessioner låser samma resurser i en annan ordning, vilket orsakar ett dödläge.

Se det här avsnittet i koncepthandboken för mer information.

För att lösa detta, lägg till index på alla oindexerade främmande nycklar. Om kolumnnamnen är standard kan ett skript som detta hjälpa dig att hitta potentiella kandidater:

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


  1. Hur sanerar man ODBC-databasindata?

  2. SELECT DISTINCT Fungerar inte Android SQLite

  3. Kan inte lägga till mysql-drivrutin till jboss

  4. Hur slutför jag denna SSH-tunnel från lokal utvecklingsdocka till iscensättningsdatabas