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

Znajdowanie przyczyny błędu zakleszczenia w pliku śledzenia Oracle

Przede wszystkim select Instrukcja nigdy nie blokuje niczego w Oracle, po prostu używa ostatniej dostępnej spójnej wersji danych. To nie jest przypadek, gdy select ... for update który blokuje dane, takie jak update od Oracle 9i, ale nie ma for update klauzula w zapytaniu z pytania.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

Sesja nr 72 utrzymuje blokadę na poziomie tabeli (TM) z typem „Row Exclusive” (SX) i chce uzyskać blokadę „Share Row Exclusive” (SSX) na tej samej tabeli. Ta sesja została zablokowana przez Sesję #24, która już posiada blokadę na poziomie tabeli tego samego typu (SX) i czeka, aż blokada SSX będzie dostępna.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Ten (drugi rząd) pokazuje dokładnie tę samą sytuację, ale w przeciwnym kierunku:Sesja #24 czeka, aż blokada SSX stanie się dostępna, ale zablokowana przez Sesję #72, która już posiada blokadę SX na tej samej tabeli.

Tak więc Sesje #24 i Sesja #72 blokują się nawzajem:następuje impas.

Oba typy blokad (SX i SSX) są blokadami na poziomie tabeli.
Aby zrozumieć sytuację, polecam przeczytać ten artykuł Francka Pachota.

Poniżej znajduje się cytat z tego artykułu, który bezpośrednio odnosi się do Twojej sytuacji (zauważ, że skróty SSX i SRX są równoważne):

Integralność referencyjna uzyskuje również blokady TM. Na przykład częsty problem z nieindeksowanymi kluczami obcymi prowadzi do blokad S w tabeli podrzędnej po wydaniu usunięcia lub aktualizacji klucza w tabeli nadrzędnej. Dzieje się tak, ponieważ Oracle bez indeksu nie ma do zablokowania pojedynczego zasobu niższego poziomu, aby zapobiec jednoczesnemu wstawianiu, które może naruszyć integralność referencyjną.
Kiedy kolumny kluczy obcych są kolumnami wiodącymi w zwykłym indeksie, wówczas pierwszy wpis indeksu z wartość parentvalue może być używana jako pojedynczy zasób i zablokowana za pomocą funkcji TXlock na poziomie wiersza.
A co jeśli integralność referencyjna ma kaskadę usuwania? Oprócz trybu S istnieje zamiar aktualizacji wierszy w tabeli podrzędnej, tak jak w trybie Row X (RX). W tym miejscu występuje wyłączność na akcje (SRX):S+RX=SRX.

Tak więc najbardziej prawdopodobnym wariantem jest to, że Sesja #72 i Sesja #24 usuwają niektóre wiersze w EMPLOYEE tabeli w tym samym czasie i są on delete cascade ograniczenie dla EMPSAL_EMP_ID w związku z brakiem indeksu na EMPLOYEE_SALARY tabela, w której EMPSAL_EMP_ID kolumna wymieniona jako pierwsza.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wstawianie do tabeli zagnieżdżonej Oracle w Javie

  2. Oracle SQL — sumowanie i grupowanie danych według tygodnia

  3. Nie można połączyć się z bazą danych Oracle za pomocą JDBC, jeśli hasło zawiera znaki specjalne

  4. Jak wyodrębnić numer tygodnia w sql

  5. Wydano SQL Developer 4.0