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 A
SELECT 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?

Author: Vlad Mihalcea, 2012-06-15

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.

 106
Author: Thilo,
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.

 75
Author: BateTech,
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 .

 6
Author: egraldlo,
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.

 5
Author: Subhadeep Ray,
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:

Tutaj wpisz opis obrazka

    Alicja i Bob rozpoczynają dwie transakcje w bazie danych.
  1. Bob ' s odczytuje rekord post, a wartość kolumny title to Transactions.
  2. Alicja modyfikuje tytuł danego rekordu pocztowego do wartości ACID.
  3. / Align = "center" bgcolor = "# e0ffe0 " / król Danii / / align = center /
  4. 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:

Tutaj wpisz opis obrazka

    Alicja i Bob rozpoczynają dwie transakcje w bazie danych.
  1. Bob ' s odczytuje wszystkie rekordy post_comment powiązane z wierszem post o wartości identyfikatora 1.
  2. Alice dodaje nowy rekord post_comment, który jest powiązany z wierszem post o wartości identyfikatora 1.
  3. Alice / align = "left" /
  4. 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ń.

 4
Author: Vlad Mihalcea,
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.

 3
Author: Jeffrey Kemp,
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ą.

 1
Author: Erwin Smout,
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.

 0
Author: Han R,
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