Jaka jest różnica między niepowtarzalnym odczytem a odczytem fantomowym?
Przeczytałem artykuł Isolation (systemy bazodanowe) z Wikipedii , ale mam kilka wątpliwości. W poniższym przykładzie, co się stanie: niepowtarzalny odczyt i odczyt fantomowy ?
Transakcja ASELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
WYNIK:
1----MIKE------29019892---------5000
Transakcja B
UPDATE USERS SET amount=amount+5000 where ID=1 AND accountno=29019892;
COMMIT;
Transakcja A
SELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
Kolejną wątpliwością jest w powyższym przykładzie, który poziom izolacji należy zastosować? I dlaczego?
database
oracle
transactions
isolation-level
transaction-isolation
user1357722
źródło
źródło
Odpowiedzi:
Z Wikipedii (która ma świetne i szczegółowe przykłady):
i
Proste przykłady:
select sum(x) from table;
zwróci inny wynik, nawet jeśli żaden z tych wierszy nie został zaktualizowany, jeśli wiersze zostały dodane lub usunięte.Wymagany poziom izolacji zależy od aplikacji. „Lepszy” poziom izolacji wiąże się z wysokimi kosztami (np. Zmniejszona współbieżność).
W twoim przykładzie nie będziesz miał odczytu fantomu, ponieważ wybierasz tylko z jednego wiersza (identyfikowanego przez klucz podstawowy). Możesz mieć niepowtarzalne odczyty, więc jeśli jest to problem, możesz chcieć mieć poziom izolacji, który temu zapobiega. W Oracle transakcja A może również wydać SELECT FOR UPDATE, wtedy transakcja B nie może zmienić wiersza, dopóki A nie zostanie zakończona.
źródło
Prosty sposób, w jaki lubię o tym myśleć, to:
Zarówno odczyty niepowtarzalne, jak i fantomowe mają do czynienia z operacjami modyfikacji danych z innej transakcji, które zostały zatwierdzone po rozpoczęciu transakcji, a następnie odczytane przez transakcję.
Niepowtarzalne odczyty mają miejsce, gdy transakcja odczytuje zatwierdzone AKTUALIZACJE z innej transakcji. Ten sam wiersz ma teraz inne wartości niż na początku transakcji.
Phantom czyta są podobne, ale podczas czytania z zaangażowanych INSERTÓW i / lub usuwa z innej transakcji. Pojawiły się nowe wiersze lub wiersze, które zniknęły od czasu rozpoczęcia transakcji.
Brudne odczyty są podobne do odczytów niepowtarzalnych i fantomowych, ale odnoszą się do odczytywania danych NIEZGODNYCH i występują, gdy odczytywana jest AKTUALIZACJA, WSTAWIANIE lub USUWANIE z innej transakcji, a inna transakcja NIE zatwierdziła jeszcze danych. Odczytuje dane „w toku”, które mogą nie być kompletne i mogą nigdy nie zostać zatwierdzone.
źródło
Jak wyjaśniono w tym artykule , anomalia Niepowtarzalnego odczytu wygląda następująco:
W tym artykule o Phantom Read możesz zobaczyć, że ta anomalia może się zdarzyć w następujący sposób:
Tak więc, podczas gdy Niepowtarzalny odczyt dotyczy pojedynczego wiersza, Phantom Read dotyczy zakresu rekordów, które spełniają podane kryteria filtrowania zapytań.
źródło
Przeczytaj zjawiska
UPDATE
zapytania z innej transakcjiINSERT
lubDELETE
zapytania z innej transakcjiUwaga : instrukcje DELETE z innej transakcji również mają bardzo małe prawdopodobieństwo spowodowania Niepowtarzalnych odczytów w niektórych przypadkach. Dzieje się tak, gdy instrukcja DELETE powoduje niestety usunięcie tego samego wiersza, którego dotyczyła bieżąca transakcja. Jest to jednak rzadki przypadek i znacznie mniej prawdopodobne w przypadku bazy danych, która ma miliony wierszy w każdej tabeli. Tabele zawierające dane transakcyjne zwykle zawierają dużą ilość danych w dowolnym środowisku produkcyjnym.
Możemy również zauważyć, że AKTUALIZACJE mogą być częstszym zadaniem w większości przypadków użycia, a nie faktyczne WSTAWIANIE lub USUWANIE (w takich przypadkach istnieje tylko niebezpieczeństwo niepowtarzalnych odczytów - w takich przypadkach odczyty fantomowe nie są możliwe). Dlatego AKTUALIZACJE są traktowane inaczej niż INSERT-DELETE, a wynikająca z nich anomalia jest również inaczej nazywana.
Istnieje również dodatkowy koszt przetwarzania związany z obsługą operacji INSERT-DELETE, a nie tylko obsługi aktualizacji.
Korzyści z różnych poziomów izolacji
Dlaczego więc nie ustawić transakcji w dowolnym momencie jako SERIALIZOWALNA? Cóż, odpowiedź na powyższe pytanie brzmi: ustawienie SERIALIZABLE powoduje, że transakcje są bardzo wolne , czego znowu nie chcemy.
W rzeczywistości zużycie czasu transakcji kształtuje się następująco:
Zatem ustawienie READ_UNCOMMITTED jest najszybsze .
Podsumowanie
Właściwie musimy przeanalizować przypadek użycia i zdecydować o poziomie izolacji, aby zoptymalizować czas transakcji, a także zapobiec większości anomalii.
Zauważ, że bazy danych domyślnie mają ustawienie REPEATABLE_READ.
źródło
Istnieje różnica w implementacji między tymi dwoma rodzajami poziomów izolacji.
W przypadku „niepowtarzalnego odczytu” potrzebne jest blokowanie wierszy.
Do „odczytu fantomowego” , potrzebne jest blokowanie zakresu, nawet blokowanie tabeli.
Możemy zaimplementować te dwa poziomy za pomocą protokołu blokowania dwufazowego .
źródło
W systemie z niepowtarzalnymi odczytami wynik drugiego zapytania Transakcji A będzie odzwierciedlał aktualizację w Transakcji B - zobaczy nową kwotę.
W systemie, który umożliwia odczyty fantomowe, jeśli Transakcja B miałaby wstawić nowy wiersz o identyfikatorze = 1, Transakcja A zobaczy nowy wiersz po wykonaniu drugiego zapytania; tj. odczyty fantomowe są szczególnym przypadkiem odczytu niepowtarzalnego.
źródło
Przyjęta odpowiedź wskazuje przede wszystkim na to, że tak zwane rozróżnienie między nimi w rzeczywistości nie jest wcale istotne.
Jeśli „wiersz jest pobierany dwukrotnie, a wartości w wierszu różnią się między odczytami”, to nie są one tym samym wierszem (nie jest to ta sama krotka w prawidłowym języku RDB) i rzeczywiście z definicji jest tak, że „zbiór wiersze zwrócone przez drugie zapytanie różnią się od pierwszego ".
Jeśli chodzi o pytanie „jaki poziom izolacji powinien być użyty”, im bardziej Twoje dane są gdzieś dla kogoś istotne, tym bardziej będzie tak, że Serializable jest jedyną rozsądną opcją.
źródło
Myślę, że istnieje pewna różnica między odczytem niepowtarzalnym i odczytem fantomowym.
Niepowtarzalność oznacza, że istnieją transakcje holowania A i B., jeśli B może zauważyć modyfikację A, więc może się zdarzyć brudny odczyt, więc pozwalamy B zauważyć modyfikację A po zatwierdzeniu A.
Jest nowy problem: pozwalamy B zauważyć modyfikację A po zatwierdzeniu A, oznacza to, że A modyfikuje wartość wiersza, który trzyma B, kiedyś B ponownie przeczyta wiersz, więc B otrzyma nową wartość inną za pierwszym razem get, nazywamy to Niepowtarzalnym, aby poradzić sobie z problemem, pozwalamy B zapamiętać coś (bo nie wiem, co zostanie jeszcze zapamiętane), gdy B zacznie.
Pomyślmy o nowym rozwiązaniu, możemy zauważyć, że jest też nowy problem, ponieważ pozwalamy B coś zapamiętać, więc cokolwiek wydarzyło się w A, nie można wpłynąć na B, ale jeśli B chce wstawić jakieś dane do tabeli, a B sprawdź tabelę, aby upewnić się, że nie ma rekordu, ale te dane zostały wstawione przez A, więc może wystąpić jakiś błąd. Nazywamy to Phantom-read.
źródło
Niepowtarzalny odczyt jest poziomem izolacji, a odczyt fantomowy (odczyt wartości zatwierdzonej przez inne transakcje) jest pojęciem (typ odczytu, np. brudny odczyt lub odczyt migawki). Niepowtarzalny poziom izolacji odczytu umożliwia odczyt fantomowy, ale nie umożliwia odczytów brudnych lub migawkowych.
źródło