Jaka jest różnica między odczytem Nie powtarzalnym a odczytem fantomowym?
Jaka jest różnica między odczytem nie powtarzalnym 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: nie powtarzalny odczyt i odczyt phantom ?
Transakcja ASELECT ID, USERNAME, accountno, amount FROM USERS WHERE ID=1
wyjście:
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 stosować? I dlaczego?
8 answers
Z Wikipedii (która ma świetne i szczegółowe przykłady na to):
Nie powtarzalny odczyt występuje, gdy w trakcie transakcji wiersz jest pobierany dwa razy, a wartości w wierszu różnią się między odczytami.
I
Odczyt fantomowy występuje, gdy w trakcie transakcji wykonywane są dwa identyczne zapytania, a zbiór wierszy zwracanych przez drugie zapytanie różni się od pierwszego.
Proste przykłady:
- użytkownik A uruchamia dwa razy to samo zapytanie.
- pomiędzy, użytkownik B uruchamia transakcję i zatwierdza.
- Non-repeatable read: wiersz A, który użytkownik a odpytywał, ma inną wartość za drugim razem.
- Phantom read: wszystkie wiersze w zapytaniu mają tę samą wartość przed i po, ale różne wiersze są wybierane (ponieważ B usunął lub wstawił niektóre). Przykład:
select sum(x) from table;
zwróci inny wynik, nawet jeśli żaden z wierszy, których dotyczy problem same zostały zaktualizowane, jeśli wiersze zostały dodane lub usunięte.
W powyższym przykładzie, jaki poziom izolacji zastosować?
Jaki poziom izolacji potrzebujesz zależy od Twojego zastosowania. Istnieje wysoki koszt "lepszego" poziomu izolacji (np. zmniejszona współbieżność).
W twoim przykładzie nie będziesz mieć odczytu phantom, ponieważ wybierasz tylko z jednego wiersza (identyfikowanego przez klucz główny). Możesz mieć odczyty nie powtarzalne, więc jeśli to jest problem, możesz może chcieć mieć poziom izolacji, który temu zapobiega. W Oracle transakcja A może również wystawić opcję SELECT do aktualizacji, a transakcja B nie może zmienić wiersza do momentu zakończenia A.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-24 16:09:12
A simple way I like to think about it is:
Zarówno odczyt powtarzalny, jak i odczyt fantomowy mają związek z operacjami modyfikacji danych z innej transakcji, które zostały popełnione po rozpoczęciu transakcji, a następnie odczytane przez transakcję.
Odczyty powtarzalne są wtedy, gdy transakcja odczytuje zatwierdzone aktualizacje z innej transakcji. Ten sam wiersz ma teraz inne wartości niż w momencie rozpoczęcia transakcji.
Odczyty Phantom są podobne, ale podczas odczytu z committed wstawia i/lub usuwa z innej transakcji. Istnieją nowe wiersze lub wiersze, które zniknęły od rozpoczęcia transakcji.
Brudne odczyty są podobne do odczytów nie powtarzalnych i fantomowych, ale odnoszą się do odczytu NIEZAKONTRAKTOWANYCH danych i występują, gdy odczyt aktualizacji, Wstawienia lub usunięcia z innej transakcji jest odczytywany, a druga transakcja nie zatwierdziła jeszcze danych. Jest odczytywanie danych "w toku", które mogą nie być kompletna i może nigdy nie być zaangażowana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 20:19:04
Istnieje różnica w implementacji pomiędzy tymi dwoma rodzajami poziomów izolacji.
W przypadku "odczytu nie powtarzalnego" konieczne jest blokowanie wierszy.
Dla "Phantom read", scoped-blokowanie jest potrzebne, nawet tabeli blokowania.
Możemy zaimplementować te dwa poziomy używając protokołu dwufazowego blokowania .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 06:46:58
Dirty read : odczyt niezarejestrowanych danych z innej transakcji.
Non-repeatable read : odczytuje dane z zapytania aktualizacyjnego z innej transakcji.
Phantom read: odczytuje dane z INSERT lub usuwa zapytanie z innej transakcji.
Zauważ tutaj, że aktualizacje mogą być częstszym zadaniem w niektórych przypadkach niż rzeczywiste wstawianie lub usuwanie - w takich przypadkach niebezpieczeństwo powtarzalnych odczytów pozostaje tylko - odczyty fantomowe nie są możliwe w tych przypadkach. Dlatego aktualizacje są traktowane inaczej niż INSERT-DELETE, a dana anomalia jest również inaczej nazwana.
Istnieje również dodatkowy koszt przetwarzania związany z obsługą INSERT-DELETE , a nie tylko obsługą aktualizacji.
Isolation level TRANSACTION_READ_UNCOMMITTED nic nie zapobiega. To zerowy poziom izolacji.
Isolation level TRANSACTION_READ_COMMITTED zapobiega tylko jednemu, czyli Brudne czytanki.
Poziom izolacji TRANSACTION_REPEATABLE_READ zapobiega dwóm anomaliom: odczytom brudnym i odczytom powtarzalnym.
Isolation level TRANSACTION_SERIALIZABLE zapobiega wszystkim trzem anomaliom: odczytom brudnym, odczytom Nie powtarzalnym i odczytom fantomowym.
To dlaczego po prostu nie ustawisz transakcji SERIALIZOWALNEJ przez cały czas ??
Cóż, odpowiedź na powyższe pytanie brzmi : ustawienie SERIALIZOWALNE sprawia, że transakcje są bardzo powolne, czego ponownie nie chcemy.
W rzeczywistości czas transakcji jest w następująca stawka:
SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED .
Więc ustawienie READ_UNCOMMITTED jest najszybsze .
W rzeczywistości musimy przeanalizować bazę użytkowników 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 11:17:35
Jak wyjaśniono w w tym artykule , anomalia nie powtarzalnego odczytu wygląda następująco:
-
Alicja i Bob rozpoczynają dwie transakcje w bazie danych.
- Bob ' s odczytuje rekord post, a wartość kolumny title to Transactions.
- Alicja modyfikuje tytuł danego rekordu pocztowego do wartości ACID. / Align = "center" bgcolor = "# e0ffe0 " / król Danii / / align = center /
- Jeśli Bob przeczyta rekord posta, będzie obserwował inną wersję tego wiersza tabeli.
W tym artykule o Phantom Read widać, że ta anomalia może się zdarzyć w następujący sposób:
-
Alicja i Bob rozpoczynają dwie transakcje w bazie danych.
- Bob ' s odczytuje wszystkie rekordy post_comment powiązane z wierszem post o wartości identyfikatora 1.
- Alice dodaje nowy rekord post_comment, który jest powiązany z wierszem post o wartości identyfikatora 1.
- Alice / align = "left" /
- Jeśli Bob przeczyta rekordy post_comment o wartości kolumny post_id równej 1, będzie obserwował inną wersję tego zestawu wyników.
Tak więc, podczas gdy nie powtarzalny odczyt dotyczy pojedynczego wiersza, odczyt Phantom dotyczy zakresu rekordów spełniających określone kryteria filtrowania zapytań.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-02 05:00:08
W systemie z powtarzalnymi odczytami wynik drugiego zapytania transakcji A będzie odzwierciedlał aktualizację w transakcji B - zobaczy nową kwotę.
W systemie, który pozwala na odczyt phantom, jeśli transakcja B powinna wstawić nowy wiersz o ID = 1, transakcja a zobaczy nowy wiersz podczas wykonywania drugiego zapytania; tzn. odczyty phantom są szczególnym przypadkiem odczytu nie powtarzalnego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-15 05:19:19
Przyjęta odpowiedź wskazuje przede wszystkim na to, że tak zwane rozróżnienie między tymi dwoma nie jest w ogóle znaczące.
Jeśli "wiersz jest pobierany dwa razy, 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 mowie RDB) i jest to rzeczywiście z definicji również przypadek ,że "zbiór wierszy zwróconych przez drugie zapytanie różni się od pierwszego".
Na pytanie " jaki poziom izolacji powinien być używane", im bardziej Twoje dane mają kluczowe znaczenie dla kogoś, gdzieś, tym bardziej będzie tak, że Serializowalny jest twoją jedyną rozsądną opcją.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 19:45:30
Myślę, że jest jakaś różnica między Nie powtarzalnym-odczytem i phantom-odczytem.
Nieodwracalne oznacza, że istnieje transakcja tow a & B. Jeśli B zauważy modyfikację a, to może się zdarzyć, więc niech B zauważy modyfikację a po zatwierdzeniu.
Jest nowy problem: pozwalamy B zauważyć modyfikację a po zatwierdzeniu, to znaczy zmodyfikować wartość wiersza, który B trzyma, czasami B ponownie odczyta wiersz, więc B otrzyma nową wartość inaczej z pierwszym razem dostajemy, nazywamy to Non-repeatable, aby poradzić sobie z problemem, pozwalamy B zapamiętać coś (bo nie wiem, co zostanie zapamiętane jeszcze), gdy B start.
Zastanówmy się nad nowym rozwiązaniem, możemy zauważyć, że jest nowy problem, ponieważ pozwalamy B zapamiętać coś, więc cokolwiek się stało W A, B nie może być naruszone, ale jeśli B chce wstawić jakieś dane do tabeli i 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 14:08:49