sql >> Database >  >> RDS >> Oracle

Hulp nodig bij het begrijpen van het gedrag van SELECT ... FOR UPDATE waardoor een impasse ontstaat

De USER-tabel heeft waarschijnlijk veel externe sleutels die ernaar verwijzen. Als een van deze niet-geïndexeerd is, zal Oracle de hele onderliggende tabel vergrendelen terwijl de rij uit de bovenliggende tabel wordt verwijderd. Als meerdere instructies tegelijkertijd worden uitgevoerd, zelfs voor een andere gebruiker, worden dezelfde onderliggende tabellen vergrendeld. Aangezien de volgorde van deze recursieve bewerkingen niet kan worden gecontroleerd, is het mogelijk dat meerdere sessies dezelfde bronnen in een andere volgorde vergrendelen, waardoor een impasse ontstaat.

Zie dit gedeelte in de conceptenhandleiding voor meer informatie.

Om dit op te lossen, voegt u indexen toe aan niet-geïndexeerde externe sleutels. Als de kolomnamen standaard zijn, kan een script als dit u helpen potentiële kandidaten te vinden:

--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. Hoe te controleren of een kolom bestaat in een SQL Server-tabel?

  2. Wat vindt u van Postgres- en Firebird-databases?

  3. CakePHP:instellen van ACL toestaan/weigeren werkt niet (tabellen worden niet bijgewerkt)?

  4. Gegevenstype array, gesplitste tekenreeks,