it-swarm.dev

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

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?

12
parmanand

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 punktem w czasie tuż przed początek instrukcji, ale z większości przykładów, które widziałem, próbujących zaimplementować tę logikę, ludzie widzą instrukcję wielorzędową jako serię kolejnych kroków i oczekują, że instrukcja [2] zobaczy zmiany wprowadzone 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.

17
Vincent Malgrat

mutating table występuje, gdy instrukcja powoduje uruchomienie wyzwalacza, który odwołuje się do tabeli, która spowodowała uruchomienie wyzwalacza. 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:

9
Leigh Riffel