Niespójność powtarzalnego odczytu

10

http://www.postgresql.org/docs/9.2/static/transaction-iso.html

Tryb powtarzalnego odczytu zapewnia rygorystyczną gwarancję, że każda transakcja widzi całkowicie stabilny widok bazy danych. Jednak ten widok niekoniecznie musi być spójny z niektórymi szeregowymi (pojedynczymi) realizacjami równoczesnych transakcji na tym samym poziomie. Na przykład, nawet transakcja tylko do odczytu na tym poziomie może zobaczyć rekord kontroli zaktualizowany, aby pokazać, że partia została ukończona, ale nie może zobaczyć jednego z rekordów szczegółowych, który jest logicznie częścią partii, ponieważ odczytał wcześniejszą wersję rekordu kontroli . Próby egzekwowania reguł biznesowych przez transakcje działające na tym poziomie izolacji prawdopodobnie nie będą działać poprawnie bez ostrożnego użycia jawnych blokad w celu blokowania sprzecznych transakcji.

Czy to nie jest odczyt fantomowy, co nie jest możliwe w trybie powtarzalnego odczytu?

Dokumentacja mówi, że zapytanie w powtarzalnej transakcji odczytu widzi migawkę od początku transakcji, to w jaki sposób zapytanie może odczytać niespójne dane?

alicja
źródło

Odpowiedzi:

5

Oto moje czytanie tej sekcji. Przyznaję, że jest to mylące.

Załóżmy, że mam dwie tabele:

CREATE TABLE batch (
   id serial not null unique,
   control_code text primary key,
   date_posted date not null default now()
);

CREATE TABLE details (
   batch_id int not null references batch(id),
   description text,
   primary key(batch_id, description)
);

Załóżmy teraz, że wstawiamy rekordy partii i szczegółów w różnych transakcjach. Sesja 1 wstawia partię i rozpoczyna wstawianie szczegółów, ale przed jej zakończeniem rozpoczyna się sesja 2. Sesja 2 wyświetla informacje o nagłówku partii, ale nie czeka na zatwierdzenie szczegółów, aby poinformować użytkownika, że ​​nie znaleziono żadnych rekordów. Teraz, jeśli Twoja partia i dane są w całości w tej samej transakcji, to nigdy nie jest to problem.

różni się to od serializowalnego, w którym oczekiwałbyś, że poprzednia wstawka się zakończy i zatwierdzi lub cofnie przed ustaleniem, czy powiadomić użytkownika, że ​​nie znaleziono wierszy.

Chris Travers
źródło
3

Na Wiki PostgreSQL znajduje się dokument, który pokazuje pewne problemy, które mogą wystąpić w przypadku niektórych kombinacji transakcji na poziomie izolacji transakcji POWTARZALNEJ CZYTANIA oraz w jaki sposób można ich uniknąć na poziomie izolacji transakcji SERIALIZABLE, poczynając od wersji PostgreSQL 9.1.

Zawiera także przykład, w jaki sposób w przypadku POWTARZALNEJ transakcji READ-TYLKO DO ODCZYTU można odczytać niespójne dane.

907th
źródło
@dezso Może Cię to zainteresować
907
1

Odczyty fantomowe (pamiętaj, aby tego nie mylić z odczytami niepowtarzalnymi) są możliwe na poziomie izolacji „Powtarzalne czytanie” ... w zasadzie. Ale faktyczne zachowanie Postgresqla po wybraniu opcji „Powtarzalne czytanie” jest silniejsze niż standardowe (prawie izolacja „szeregowa”), tak że w rzeczywistości nie będziesz mieć odczytów fantomowych. Dokumenty :

Po wybraniu poziomu Odczyt niezatwierdzony, naprawdę otrzymujesz Odczyt zatwierdzony, a odczyty fantomowe nie są możliwe w implementacji PostgreSQL odczytu powtarzalnego , więc rzeczywisty poziom izolacji może być surowszy niż wybrany.

A co z tym zastrzeżeniem „ten widok niekoniecznie zawsze będzie spójny z niektórymi szeregowymi (pojedynczymi) realizacjami równoczesnych transakcji na tym samym poziomie”? Myślę (nie jestem pewien), co oznacza, że ​​oznacza to, że migawka „z zewnątrz” (ustalona na początku transakcji) może ostatecznie zawierać wiersze z innych transakcji, ale nie zawierać niektórych innych wierszy z tej samej transakcji.

leonbloy
źródło