PostgreSQL - BLOKADY
Zamki i Exclusive zamki lub zamki Zapis uniemożliwić użytkownikom modyfikowanie wiersz lub całą tabelę. Wiersze zmodyfikowane przez UPDATE i DELETE są następnie automatycznie blokowane na wyłączność na czas trwania transakcji. Zapobiega to zmianie wiersza przez innych użytkowników, dopóki transakcja nie zostanie zatwierdzona lub wycofana.
Jedynym momentem, w którym użytkownicy muszą czekać na innych użytkowników, jest próba zmodyfikowania tego samego wiersza. Jeśli modyfikują różne wiersze, czekanie nie jest konieczne. Zapytania SELECT nigdy nie muszą czekać.
Baza danych automatycznie blokuje. Jednak w niektórych przypadkach blokowanie musi być sterowane ręcznie. Ręczne blokowanie można wykonać za pomocą polecenia LOCK. Pozwala określić typ i zakres blokady transakcji.
Składnia polecenia LOCK
Podstawowa składnia polecenia LOCK jest następująca -
LOCK [ TABLE ]
name
IN
lock_mode
name- nazwa (opcjonalnie kwalifikowana według schematu) istniejącej tabeli do zablokowania. Jeśli przed nazwą tabeli podano TYLKO, tylko ta tabela jest zablokowana. Jeśli nie określono ONLY, tabela i wszystkie jej tabele podrzędne (jeśli istnieją) są zablokowane.
lock_mode- Tryb blokady określa, z którymi blokadami koliduje ta blokada. Jeśli nie określono trybu blokady, używany jest tryb ACCESS EXCLUSIVE, najbardziej restrykcyjny. Możliwe wartości to: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.
Po uzyskaniu blokada jest utrzymywana przez pozostałą część bieżącej transakcji. Nie ma polecenia ODBLOKUJ TABELĘ; blokady są zawsze zwalniane na koniec transakcji.
DeadLocks
Zakleszczenia mogą wystąpić, gdy dwie transakcje oczekują na siebie, aby zakończyć swoje operacje. Chociaż PostgreSQL może je wykryć i zakończyć za pomocą ROLLBACK, zakleszczenia mogą być nadal niewygodne. Aby zapobiec występowaniu tego problemu przez aplikacje, pamiętaj o zaprojektowaniu ich w taki sposób, aby blokowały obiekty w tej samej kolejności.
Advisory Locks
PostgreSQL zapewnia środki do tworzenia blokad, które mają znaczenie zdefiniowane przez aplikację. Są to tak zwane blokady doradcze . Ponieważ system nie wymusza ich użycia, prawidłowe ich użycie zależy od aplikacji. Blokady doradcze mogą być przydatne w strategiach blokowania, które są niewygodne dla modelu MVCC.
Na przykład, powszechnym zastosowaniem blokad doradczych jest emulacja pesymistycznych strategii blokowania, typowych dla tak zwanych systemów zarządzania danymi „plików płaskich”. Chociaż flaga przechowywana w tabeli może być użyta w tym samym celu, blokady doradcze są szybsze, pozwalają uniknąć przepełnienia tabeli i są automatycznie czyszczone przez serwer po zakończeniu sesji.
Przykład
Rozważ poniższą tabelę FIRMA zawierająca rekordy -
testdb# select * from COMPANY;
id | name | age | address | salary
----+-------+-----+-----------+--------
1 | Paul | 32 | California| 20000
2 | Allen | 25 | Texas | 15000
3 | Teddy | 23 | Norway | 20000
4 | Mark | 25 | Rich-Mond | 65000
5 | David | 27 | Texas | 85000
6 | Kim | 22 | South-Hall| 45000
7 | James | 24 | Houston | 10000
(7 rows)
Poniższy przykład blokuje tabelę COMPANY w bazie danych testdb w trybie ACCESS EXCLUSIVE. Instrukcja LOCK działa tylko w trybie transakcyjnym -
testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
Powyższa instrukcja PostgreSQL da następujący wynik -
LOCK TABLE
Powyższy komunikat wskazuje, że tabela jest zablokowana do momentu zakończenia transakcji i aby zakończyć transakcję, będziesz musiał wycofać lub zatwierdzić transakcję.