2012-08-24 12 views
8

Rozważmy następujące zapytanie wykonany w PostgreSQL (9.1 lub 9.2):Czy modyfikacja wartości współbieżnych może wpłynąć na wybór w PostgreSQL 9.1?

SELECT * FROM foo WHERE bar = true 

Załóżmy, że jest to dość długo działa zapytania (na przykład biorąc minutę).

Jeśli na początku zapytania istnieje 5 milionów rekordów, dla których bar = true ładowni, a podczas tego zapytania w innej transakcji nie są wiersze dodawane i usuwane w tabeli foo, a dla niektórych istniejących wierszy aktualizacje są wykonane z bar pole.

Czy to wpłynie na wynik powyższego zapytania?

Wiem o izolacji transakcji i widoczności między oddzielnymi oświadczeniami w pojedynczej transakcji, ale co z pojedynczą instrukcją, która działa?

Odpowiedz

10

nr
Ze względu na modelu MVCC tylko krotek, które są widoczne na zapytania startowym zostaną wykorzystane w jednym SELECT. Szczegółowe informacje w instrukcji obsługi: here:

Read Committed to domyślny poziom izolacji w PostgreSQL. Gdy transakcja używa tego poziomu izolacji, zapytanie SELECT (bez klauzuli UPDATE/SHARE FOR ) widzi tylko dane zatwierdzone przed rozpoczęciem zapytania; Nigdy nie widzi niezatwierdzonych danych ani zmian wprowadzonych podczas wykonywania zapytania przez równoczesne transakcje. W efekcie zapytanie SELECT widzi migawkę bazy danych od chwili uruchomienia zapytania do uruchomienia . Jednak SELECT dostrzega efekty poprzednich aktualizacji wykonanych w ramach własnej transakcji, nawet jeśli nie zostały jeszcze zatwierdzone. Należy również zauważyć, że dwa kolejne polecenia SELECT mogą wyświetlać różne dane, , nawet jeśli są w ramach jednej transakcji, jeśli inne transakcje zatwierdzają zmiany podczas wykonywania pierwszego SELECT.

Podkreślam moją.

5

Zapytanie będzie spójnym dla odczytu widokiem danych na początku zapytania. W Postgresql, dokumentacja na temat wielordzeniowej kontroli współbieżności (MVCC) wyjaśnia, jak się to robi (wiele wersji rekordu istnieje w tabeli). W Oracle, numer zmiany sekwencji (SCN) jest używany wraz z "przed-obrazami" zmodyfikowanych danych. Oto stary dokument, Transaction Processing in Postgresql, z sekcją "nie nadpisywanie zarządzania pamięcią masową". Ale spójrz na MVCC.

Lub przeczytaj rozdział o MVCC w dokumencie PostgreSQL

Powiązane problemy