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

Czy możliwe jest zakleszczenie podczas aktualizowania i usuwania różnych wierszy w tabeli?

Jeśli mógłbyś zaktualizować swoje pytanie za pomocą wykresu impasu, byłaby to przydatna informacja. (Gdy aplikacja napotka zakleszczenie, Oracle podniesie ORA-00060, a plik śledzenia zostanie zapisany do user_dump_dest.) Jeśli zajrzysz do pliku śledzenia, znajdziesz sekcję o nazwie „Wykres zakleszczenia”. Jeśli możesz to opublikować, a także zamieścić oświadczenie, które spowodowało zakleszczenie i inne oświadczenia związane z zakleszczeniem, wtedy możemy zacząć wyciągać pewne wnioski. (Wszystkie informacje, o które prosiłem, są dostępne w pliku śledzenia.)

Jak wspomniał Alessandro, możliwe jest zakleszczenie sesji blokujących różne wiersze w tej samej tabeli z powodu niezindeksowanych kluczy obcych w tabeli podrzędnej relacji rodzic/dziecko. Ponadto możliwe jest wystąpienie zakleszczeń w dwóch sesjach aktualizujących różne wiersze tej samej tabeli, nawet jeśli tabela nie jest częścią relacji nadrzędny/podrzędny, jeśli na przykład w tabeli brakuje wpisów ITL.

Ponownie opublikuj informacje wymagane powyżej, a jestem przekonany, że możemy określić podstawową przyczynę Twojego impasu.

Dodano 30.07.2012 **

Dodanie następujących elementów, teraz, gdy dostarczono plik śledzenia zakleszczeń:Ok, po pierwsze, w oparciu o zawartość pliku śledzenia, jest to proste zakleszczenie spowodowane nakładaniem się/kolidacją sesji w wierszach, które próbują zablokować. Pomimo Twoich wcześniejszych komentarzy na temat impasu na innych wierszy, jestem tutaj, aby powiedzieć, że to szczególne zakleszczenie jest spowodowane blokowaniem na poziomie wiersza na tym samym wiersze.

Fakt, że wykres zakleszczenia pokazuje tryb, w którym blokada jest utrzymywana, to „X” (na wyłączność), a tryb, w którym blokada jest oczekiwana, to „X”, mówi mi, że jest to proste blokowanie na poziomie wiersza.

W tym przypadku SID 20 wykonuje „usuń z RPT_TABLE.TEMP_TABLE_T1 gdzie TEMP_T1_ID=:1” i już ma blokada na rowid AAAPDIAAMAAAEfIAAA.

Tymczasem SID 790 wykonuje „RPT_TABLE.T1_UPDATE_StoredProc”, jednocześnie trzymając blokadę na wierszu AAAPDIAAMAAAEfGAAA.

Zauważ z sekcji "Wiersze oczekujące na" pliku śledzenia, że ​​SID 20 czeka na wiersz, który przechowuje SID 790, a SID 790 czeka na wiersz, który przechowuje SID 20. To klasyczny impas.

Kilka dodatkowych informacji:

  • Typ kolejki to TX (patrz wykres zakleszczenia), więc zdecydowanie nie blokowanie z powodu niezindeksowanych kluczy obcych. Gdyby blokował się z powodu niezindeksowanych FK, typem kolejki byłby TM, a nie TX. (Istnieje co najmniej jeden inny przypadek, w którym zaangażowane są kolejki TM i nie są to nieindeksowane pliki FK. Więc nie zakładaj, że kolejka TM zawsze oznacza nieindeksowane pliki FK.)

  • Tryb, w którym czeka blokada, to „X” (ekskluzywny), więc jest to blokowanie na poziomie wiersza. Jeśli oczekiwany tryb to „S” (współdzielony), to nie być blokowaniem na poziomie wiersza. Może to być raczej niedobór ITL lub egzekwowanie przepisów PK lub Wielkiej Brytanii.

Mam nadzieję, że to pomoże!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wybrać porównanie dwóch kolumn jako jednej kolumny w Oracle?

  2. Jak przekazać XML jako parametr do procedury składowanej w Oracle?

  3. Wpisz podzapytania ORM

  4. SQL:Uzyskaj rekordy utworzone w przedziale czasowym dla określonych dat

  5. Oracle RAC VIP i podkład ARP