Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Potrzebujesz pomocy w zrozumieniu zachowania SELECT ... FOR UPDATE powodującego zakleszczenie

Tabela USER prawdopodobnie zawiera wiele kluczy obcych, które się do niej odnoszą. Jeśli którykolwiek z nich nie jest indeksowany, Oracle zablokuje całą tabelę podrzędną, usuwając wiersz z tabeli nadrzędnej. Jeśli wiele instrukcji zostanie uruchomionych w tym samym czasie, nawet dla innego użytkownika, te same tabele podrzędne zostaną zablokowane. Ponieważ nie można kontrolować kolejności tych operacji rekurencyjnych, możliwe jest, że wiele sesji zablokuje te same zasoby w innej kolejności, powodując zakleszczenie.

Zobacz tę sekcję w podręczniku Concepts, aby uzyskać więcej informacji.

Aby rozwiązać ten problem, dodaj indeksy do wszystkich nieindeksowanych kluczy obcych. Jeśli nazwy kolumn są standardowe, taki skrypt może pomóc w znalezieniu potencjalnych kandydatów:

--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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między złączeniami ANSI i non-ANSI i które polecacie?

  2. Jak unieważnić instrukcję SQL w obszarze Oracle SQL, aby podczas zbierania statystyk powstał nowy plan?

  3. Zapytanie przestawne Oracle SQL

  4. Jaka jest domyślna precyzja i skala liczby w Oracle?

  5. Oracle konfiguruje środowisko wsparcia globalizacji