Opisywanie poziomów izolacji

Ukończone

Usługa PostgreSQL ma trzy poziomy izolacji transakcji, które uniemożliwiają trzy typy konfliktów współbieżności, brudne odczyty, nie powtarzalne odczyty i odczyty phantom.

Typy konfliktów współbieżności

Odczyty zanieczyszczone

Zanieczyszczony odczyt występuje, gdy jedna transakcja odczytuje zaktualizowaną wersję danych, którą edytuje inna transakcja. Jednak ta aktualizacja nigdy nie zostanie zatwierdzona.

Na przykład transakcja odbywa się na koncie oszczędnościowym, które miałoby saldo konta na mniej niż zero. Zanim transakcja zostanie zatwierdzona, saldo konta jest sprawdzane i transakcja jest cofana, ponieważ konta oszczędnościowe nie mogą mieć salda mniejszego niż zero. Jednocześnie raport jest uruchamiany w celu wyświetlenia bieżącego salda wszystkich kont oszczędnościowych. Jeśli odczyty brudne są dozwolone, zostanie zwrócone saldo ujemne, mimo że nigdy nie zostanie ono zatwierdzone.

Nie powtarzalne odczyty

Nie powtarzalny odczyt występuje, jeśli transakcja: odczytuje dane, kolejna transakcja aktualizuje dane, a początkowa transakcja odczytuje dane ponownie i widzi nowe aktualizacje.

Na przykład połączenie A uruchamia transakcję i odczytuje koszt jednostkowy i liczbę jednostek zamówienia, które są kosztem 10 i liczbą jednostek 3. Następnie połączenie B uruchamia inną transakcję i aktualizuje to samo zamówienie, aby ustawić koszt na jednostkę na 12. W tej samej transakcji co oryginalne zapytanie, Connection A oblicza całkowity koszt zamówienia. Jeśli odczyty nie powtarzalne są dozwolone Connection A zwraca koszt na jednostkę 10, liczbę jednostek 3 i całkowity koszt 36, co oczywiście nie ma sensu.

Odczyty phantom

Odczyt phantom występuje, jeśli transakcja: odczytuje dane, kolejna transakcja dodaje nowy wiersz (lub wiersze) do danych, a początkowa transakcja odczytuje dane ponownie i widzi nowe aktualizacje.

Na przykład Connection A rozpoczyna transakcję i zlicza łączną liczbę faktur za dzień w Paryżu. Liczba wyniosła 1100 faktur dla wszystkich 10 sklepów w Paryżu. Połączenie B następnie rozpoczyna kolejną transakcję i dodaje nowy sklep detaliczny w Paryżu z 200 fakturami za dzień otwarcia nowego sklepu. W transakcji Connection A system zlicza teraz liczbę magazynów do obliczenia liczby faktur na magazyn. Połączenie A podzieli teraz 1100 transakcji przez 11 magazynów zamiast oryginalnej 10, która istniała podczas uruchamiania zapytania o liczbę faktur. To obliczenie zwraca teraz nieprawidłową średnią 100, mimo że nowy sklep miał 200 faktur, dla których transakcja Connection A nie uwzględniała jej w obliczeniu średniej.

Poziomy izolacji

Usługa Azure Database for PostgreSQL ma trzy poziomy izolacji transakcji, odczyt zatwierdzony, powtarzalny odczyt i możliwość serializacji. Niezatwierdzony odczyt nie jest dostępny w usłudze Azure Database for PostgreSQL.

Jak poziomy izolacji wpływają na konflikty współbieżności:

Poziom izolacji Odczyt zanieczyszczony Nie powtarzalny odczyt Odczyt phantom
Odczytywanie niezatwierdzonych* Możliwy Możliwy Możliwy
Odczyt zatwierdzony Niemożliwe Możliwy Możliwy
Powtarzalny odczyt Niemożliwe Niemożliwe Możliwy
Serializacji Niemożliwe Niemożliwe Niemożliwe

* Niedostępne w usłudze PostgreSQL

Odczyt zatwierdzony jest domyślnym poziomem izolacji w usłudze Azure Database for PostgreSQL. Zatwierdzanie odczytu jest najbardziej odpowiednie w większości scenariuszy, ponieważ zapobiega brudnym odczytom przy jednoczesnym zapewnieniu dobrej wydajności. Istnieje możliwość, że odczyty nie powtarzalne i odczyty fantomowe mogą wystąpić tylko wtedy, gdy istnieje wiele instrukcji SELECT jednocześnie wykonujących zapytania dotyczące tych samych danych.

Powtarzalny odczyt różni się od odczytu zatwierdzonego, ponieważ wiele instrukcji SELECT w ramach transakcji będzie widzieć te same wyniki, nawet jeśli inna transakcja zaktualizowała wiersze między wykonaniem dwóch instrukcji SELECT transakcji. Jeśli inna transakcja wstawia nowe wiersze, te wiersze nie będą wyświetlane w wynikach drugiej instrukcji SELECT.

Poziom izolacji z możliwością serializacji zapewnia najwyższy poziom izolacji transakcji i działa tak, jakby różne transakcje były uruchomione w serii, czyli jeden po drugim. Wadą poziomu izolacji możliwej do serializacji jest to, że jeśli transakcja wykonuje aktualizację, inne transakcje mogą go zablokować. Transakcja z możliwością serializacji musi poczekać na zakończenie blokującej transakcji, co wpływa na wydajność.

Transakcje z możliwością serializacji nie mogą również wprowadzać zmian w wierszach, które inne transakcje modyfikują podczas transakcji z możliwością serializacji. Jeśli taka forma konfliktu wystąpi, zwracany jest komunikat o błędzie i dlatego ważne jest, aby logika ponawiania prób została wbudowana w aplikacje, gdy są używane transakcje z możliwością serializacji.

Aby zaktualizować poziomy izolacji transakcji, użyj polecenia TRANSACTION ISOLATION LEVEL w ramach transakcji.

Na przykład:

BEGIN TRANSACTION
TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM humanresources.department
COMMIT;