Różnica między read commit a repeatable read

Myślę, że powyższe poziomy izolacji są takie same. Czy ktoś mógłby opisać kilkoma ładnymi przykładami na czym polega główna różnica ?

Author: Fore, 2010-10-27

6 answers

Read committed jest poziomem izolacji, który gwarantuje, że wszelkie odczytywane dane zostały committed w tej chwili są odczytywane. Po prostu ogranicza czytelnika od oglądania jakichkolwiek pośrednich, nieuporządkowanych, "brudnych" lektur. Nie daje żadnej obietnicy, że jeśli transakcja ponownie wyda odczyt, znajdzie te same Dane, dane mogą się swobodnie zmieniać po ich odczytaniu.

Odczyt powtarzalny to wyższy poziom izolacji, że oprócz gwarancji poziomu odczytu, to także gwarantuje, że wszelkie odczytywane dane nie mogą się zmienić, jeśli transakcja ponownie odczyta te same dane, znajdzie wcześniej odczytane dane na miejscu, niezmienione i dostępne do odczytu.

Następny poziom izolacji, serializowalny, daje jeszcze silniejszą gwarancję: oprócz wszystkich powtarzalnych gwarancji odczytu, gwarantuje również, że Brak nowe dane będą widoczne po kolejnym odczycie.

Powiedz, że masz tabelę T z kolumną C z jednym wierszem w niej, powiedz, że ma wartość "1". I weź pod uwagę, że masz proste zadanie, takie jak następujące:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

Jest to proste zadanie, które emituje dwa odczyty z tabeli T, z opóźnieniem 1 minuty między nimi.

  • w polu READ COMITTED, drugi SELECT może zwrócić dowolne dane. Jednoczesna transakcja może aktualizować rekord, usuwać go, wstawiać nowe rekordy. Drugi select zawsze zobaczy nowe dane .
  • pod powtarzalnym odczytem drugie zaznaczenie gwarantuje wyświetlenie wierszy, które mają widoczne na początku wybierz bez zmian . Nowe wiersze mogą być dodawane przez jednoczesną transakcję w tej jednej minucie, ale istniejących wierszy nie można usunąć ani zmienić.
  • pod SERIALIZABLE reads drugi select ma gwarancję, że będzie widział dokładnie te same wiersze, co pierwszy. Żaden wiersz nie może zmienić, ani usunąć, ani nowe wiersze nie mogą być wstawiane przez jednoczesną transakcję.

Jeśli zastosujesz się do powyższej logiki, możesz szybko uświadomić sobie, że transakcje SERIALIZOWALNE, podczas gdy mogą ułatw sobie życie, zawsze całkowicie blokują każdą możliwą jednoczesną operację, ponieważ wymagają, aby nikt nie mógł modyfikować, usuwać ani wstawiać żadnego wiersza. Domyślny poziom izolacji transakcji w. Net System.Transactions scope jest serializowalny, co zwykle wyjaśnia fatalną wydajność, jaką daje.

I wreszcie, istnieje również poziom izolacji migawki. Poziom izolacji migawek daje takie same gwarancje jak serializowalny, ale nie wymagając, aby nie współbieżne transakcja może modyfikować dane. Zamiast tego zmusza każdego czytelnika do zobaczenia własnej wersji Świata (własnej "migawki"). To sprawia, że jest bardzo łatwy do programowania, a także bardzo skalowalny, ponieważ nie blokuje jednoczesnych aktualizacji. Jednak ta korzyść wiąże się z ceną: dodatkowe zużycie zasobów serwera.

Uzupełnienie:

 426
Author: Remus Rusanu,
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-05-25 01:28:15

Powtarzalny Odczyt

Stan bazy danych jest utrzymywany od początku transakcji. Jeśli odzyskasz wartość w session1, zaktualizuj ją w session2, a odzyskanie jej ponownie w session1 zwróci te same wyniki. Odczyty są powtarzalne.

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Aaron

Czytaj

W kontekście transakcji zawsze pobierasz ostatnio zatwierdzoną wartość. Jeśli pobierasz wartość w session1, zaktualizuj ją w session2, a następnie pobierz ją w session1again, otrzymasz wartość zmodyfikowaną w session2. Czyta ostatni wiersz.

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Bob
To ma sens?
 52
Author: Hazel_arun,
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
2013-05-21 14:01:30

Po prostu odpowiedź według mojego czytania i zrozumienia do tego wątku i @remus-rusanu odpowiedź opiera się na tym prostym scenariuszu:

Istnieją dwa procesy A I B. Proces B to odczyt tabeli X Proces A zapisuje się w tabeli X Proces B odczytuje ponownie tabelę X.

  • ReadUncommitted : Proces B może odczytywać niezatwierdzone dane z procesu a i może widzieć różne wiersze na podstawie zapisu B. No lock at all
  • ReadCommitted : Proces B może odczytywać tylko zatwierdzone dane z procesu A i może widzieć różne wiersze na podstawie zatwierdzonego tylko zapisu B. możemy to nazwać prostym zamkiem?
  • RepeatableRead : Proces B będzie odczytywał te same dane (wiersze) niezależnie od tego, co robi proces A. Ale proces A może zmieniać inne wiersze. Rows level Block
  • Serializowalny: Proces B będzie odczytywał te same wiersze, co wcześniej, a proces A nie może odczytywać ani zapisywać w tabeli. Poziom tabeli Blok
  • Snapshot : każdy proces ma swoją własną kopię i pracuje nad nią. Każdy ma swój własny widok
 12
Author: Mo Zaatar,
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
2016-08-04 04:50:18

Stare pytanie, które ma już zaakceptowaną odpowiedź, ale lubię myśleć o tych dwóch poziomach izolacji pod kątem tego, jak zmieniają zachowanie blokowania w SQL Server. Może to być pomocne dla tych, którzy debugują martwe punkty, jak ja.

READ COMMITTED (default)

Współdzielone blokady są pobierane w SELECT, a następnie zwalniane Po zakończeniu instrukcji SELECT. W ten sposób system może zagwarantować, że nie ma brudnych odczytów niezarejestrowanych danych. Inne transakcje mogą nadal zmieniać wiersze bazowe po zakończeniu SELECT i przed zakończeniem transakcji.

POWTARZALNY ODCZYT

Współdzielone blokady są pobierane w SELECT, a następnie zwalniane dopiero po zakończeniu transakcji . W ten sposób system może zagwarantować, że odczytane wartości nie zmienią się podczas transakcji (ponieważ pozostają zablokowane do momentu zakończenia transakcji).

 9
Author: Chris Gillum,
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-11-05 20:27:19

Próbuje wyjaśnić tę wątpliwość prostymi diagramami.

Read Committed: tutaj na tym poziomie izolacji transakcja T1 będzie odczytywała zaktualizowaną wartość X committed przez transakcję T2.

Czytaj Całość

Powtarzalny odczyt: na tym poziomie izolacji transakcja T1 nie będzie uwzględniała zmian popełnionych przez transakcję T2.

Tutaj wpisz opis obrazka

 5
Author: vkrishna17,
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-02-15 18:59:11

Moje spostrzeżenie na temat wstępnego zaakceptowanego rozwiązania.

Under RR (default mysql) - jeśli tx jest otwarty i SELECT został wywołany, inny tx nie może usunąć żadnego wiersza należącego do poprzedniego zestawu wyników odczytu, dopóki poprzedni TX nie zostanie zatwierdzony (w rzeczywistości polecenie delete w nowym tx będzie po prostu zawieszone), jednak następny tx może usunąć wszystkie wiersze z tabeli bez żadnych problemów. Btw, następny odczyt w poprzednim tx będzie nadal widział stare dane, dopóki nie zostaną zatwierdzone.

 -1
Author: Sanjeev Dhiman,
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
2016-03-02 21:04:28