Jakie są przyczyny i rozwiązania mutowania błędów tabeli?

12

Rozumiem, że mutowanie błędów tabeli jest spowodowane błędem projektowym lub problematycznym zapytaniem.

Niedawno uruchomiono starą kwerendę, która generuje błąd tabeli mutingu. Nasz DBA rozwiązał problem, ale nie wiemy jak.

Co dokładnie powoduje mutowanie błędów tabeli i jak nasz DBA rozwiązałby problem?

parmanand
źródło

Odpowiedzi:

17

Najbardziej prawdopodobną przyczyną błędu tabeli mutacji jest niewłaściwe użycie wyzwalaczy. Oto typowy przykład:

  1. wstawiasz wiersz w tabeli A
  2. wyzwalacz w tabeli A (dla każdego wiersza) wykonuje zapytanie w tabeli A, na przykład w celu obliczenia kolumny podsumowującej
  3. Oracle wyrzuca ORA-04091: tabela A mutuje, wyzwalacz / funkcja może go nie zobaczyć

Jest to oczekiwane i normalne zachowanie, Oracle chce cię chronić przed sobą, ponieważ Oracle gwarantuje:

  • (i) każda instrukcja jest niepodzielna (tzn. albo zawiedzie, albo całkowicie się powiedzie)
  • (ii) że każde oświadczenie ma spójny widok danych

Najprawdopodobniej przy pisaniu tego rodzaju wyzwalaczy oczekiwałbyś, że zapytanie (2) zobaczy wiersz wstawiony na (1). Byłoby to sprzeczne z powyższymi punktami, ponieważ aktualizacja nie jest jeszcze zakończona (może być więcej wierszy do wstawienia).

Oracle może zwrócić wynik zgodny z momentem tuż przed początkiem instrukcji, ale z większości przykładów, które widziałem, próbując zaimplementować tę logikę, ludzie widzą instrukcję wielorzędową jako serię kolejnych kroków i oczekują instrukcja [2], aby zobaczyć zmiany dokonane w poprzednich krokach. Oracle nie może zwrócić oczekiwanego wyniku i dlatego zgłasza błąd.

Do dalszej lektury: „mutating table” na Ask Tom .

Jeśli, jak podejrzewam, przyczyną błędu tabeli mutacji jest wyzwalacz, jednym ze sposobów uniknięcia błędu jest przeniesienie logiki z wyzwalacza do procedur.

Vincent Malgrat
źródło
9

Tabela mutacji występuje wtedy, gdy oświadczenie powoduje wyzwalacz do ognia i że odniesienia spustowych stole, który spowodował spust. Najlepszym sposobem uniknięcia takich problemów jest nie używanie wyzwalaczy, ale podejrzewam, że DBA nie poświęciło czasu, aby to zrobić. Mógł wykonać jedną z następujących czynności:

Leigh Riffel
źródło
1
Przynajmniej dla mnie zmiana na wyzwalacz po nie powiedzie się 11.2.0.4.0
Software Prophets
Również dla mnie; wersja 12.1.0.2.0 i PO NIE działa.
eidylon