Omówienie blokowania
Kontrolka współbieżności w wielu wersjach (MVCC) zapewnia odpowiednie ustawienia współbieżności dla większości scenariuszy. Jeśli jednak aplikacja wymaga określonych blokad, które dokładnie kontrolują, które wiersze są przez nie objęte, oraz z określonym poziomem blokady, tryby jawnych blokad umożliwiają tę precyzyjną kontrolę.
W usłudze Azure Database for PostgreSQL istnieją trzy typy jawnych blokad, blokad na poziomie tabeli, blokady na poziomie wiersza i blokady na poziomie strony. Początkowa transakcja prosi o blokadę, a jeśli zostanie zaakceptowana, żądana blokada stanie się istniejącą blokadą. Jeśli inna transakcja próbuje wyjąć blokadę na tych samych danych, blokada zostanie udzielona, jeśli nie powoduje konfliktu z oryginalną transakcją.
Na przykład dwie transakcje mogą wykonywać zapytania dotyczące tych samych danych w tym samym czasie za pomocą instrukcji SELECT. Te żądania będą używać blokady ACCESS SHARE i oba będą dozwolone. W innym scenariuszu jedna transakcja wykonuje zapytania dotyczące danych za pomocą instrukcji SELECT i blokady ACCESS SHARE, ale jednocześnie inna transakcja próbuje usunąć tę samą tabelę. Usunięcie tabeli wymaga blokady ACCESS EXCLUSIVE, której nie da się uzyskać w tym scenariuszu.
Blokady na poziomie tabeli
Blokady na poziomie całej tabeli uzyskują blokady na całą tabelę, nawet wtedy, gdy mają WIERSZ w nazwie. Blokowanie całej tabeli może być wymagane, jeśli sama tabela jest modyfikowana lub może być wydajniejsza niż usuwanie wielu blokad na poziomie wiersza.
Istnieje osiem typów blokady na poziomie tabeli w usłudze Azure Database for PostgreSQL i polecenia SQL, które uzyskują następujące typy blokad:
Tryb blokady | Uzyskane przez |
---|---|
UDOSTĘPNIJ DOSTĘP | POLECENIE SELECT |
UDZIAŁ WIERSZY | WYBIERZ OPCJĘ AKTUALIZUJ, A NASTĘPNIE WYBIERZ DLA POLECEŃ SHARE |
WYŁĄCZNY DOSTĘP DO WIERSZA | polecenia UPDATE, DELETE i INSERT |
WYŁĄCZNA AKTUALIZACJA DOTYCZĄCA UDOSTĘPNIANIA | ANALYZE, CREATE INDEX CONCURRENTLY, CREATE STATISTICS, COMMENT ON, REINDEX CONCURRENTLY polecenia, niektóre polecenia ALTER INDEX oraz ALTER TABLE, oraz VACUUM (nie FULL) |
UDOSTĘPNIJ | Polecenie "CREATE INDEX" (nie współbieżnie) |
WYŁĄCZNA BLOKADA WIERSZA | "Polecenie CREATE TRIGGER i niektóre polecenia ALTER TABLE" |
WYŁĄCZNY | POLECENIE ODŚWIEŻANIA ZMATERIALIZOWANEGO WIDOKU WSPÓŁBIEŻNIE |
DOSTĘP WYŁĄCZNY | DROP TABLE, REINDEX, TRUNCATE, CLUSTER, REFRESH MATERIALIZED VIEW (nie współbieżnie), większość poleceń ALTER INDEX i ALTER TABLE oraz pełne wyczyszczanie. |
Każdy typ istniejącej blokady uniemożliwia nabycie innych żądanych blokad. W poniższej tabeli wymieniono blokady blokujące uzyskiwanie innych blokad:
-- | Istniejący dostęp współdzielony | Istniejący UDZIAŁ WIERSZY | Istniejący WYŁĄCZNOŚĆ WIERSZA | AKTUALIZACJA DOSTĘPU W TRYBIE WYŁĄCZNOŚCI | Istniejący udział | Istniejący WYKRZYKNIK WIERSZA UDZIAŁU | Istniejąca wyłączność | ISTNIEJĄCY DOSTĘP WYŁĄCZNY |
---|---|---|---|---|---|---|---|---|
Żądany UDZIAŁ PROGRAMU ACCESS | Zablokowany | |||||||
Żądany UDZIAŁ W WIERSZU | Zablokowany | Zablokowany | ||||||
Żądany WYŁĄCZNIE WIERSZOWY | Zablokowany | Zablokowany | Zablokowany | Zablokowany | ||||
Zażądano WYŁĄCZNEJ AKTUALIZACJI UDZIAŁU | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | |||
Żądany udział | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | |||
Zażądano WYŁĄCZNEGO WIERSZA UDOSTĘPNIANIA | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | ||
Zażądano wyłączności | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | |
Żądany DOSTĘP NA WYŁĄCZNOŚĆ | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany | Zablokowany |
Blokady na poziomie wiersza
Blokady na poziomie wiersza są bardziej szczegółowe i mają wpływ tylko na inną transakcję, która uzyskuje dostęp do tego samego wiersza. Ten typ blokady poprawia współbieżność, ale uzyskiwanie i usuwanie wielu blokad negatywnie wpływa na wydajność. Blokady na poziomie wiersza są automatycznie uzyskiwane przez usługę PostgreSQL i nie są stosowane ręcznie.
Istnieją cztery typy blokady na poziomie wiersza w usłudze Azure Database for PostgreSQL i są one uzyskiwane w zależności od tego, które inne typy blokad muszą być zablokowane:
-- | Istniejący dla współdzielenia klucza | Istniejący DLA UDZIAŁU | ISTNIEJĄCY BEZ AKTUALIZACJI KLUCZA | Istniejący DO AKTUALIZACJI |
---|---|---|---|---|
Zażądano UDZIAŁU KLUCZY | Zablokowany | |||
Zażądano do udostępnienia | Zablokowany | Zablokowany | ||
Zażądano BEZ AKTUALIZACJI KLUCZA | Zablokowany | Zablokowany | Zablokowany | |
Zażądano aktualizacji | Zablokowany | Zablokowany | Zablokowany | Zablokowany |
Blokady na poziomie strony
Blokady na poziomie strony mają wpływ na stronę danych, która zwykle składa się z wielu wierszy. Mimo że procesy PostgreSQL używają blokad na poziomie strony, deweloperzy aplikacji zwykle nie wymagają tego typu blokady.
Ręczne stosowanie blokad i wyświetlanie bieżących blokad
Aby ręcznie zastosować blokadę na poziomie tabeli, możesz użyć polecenia LOCK z wymaganym trybem blokady. Polecenie LOCK musi znajdować się w transakcji, a blokady są zwalniane po zakończeniu transakcji. Na przykład:
BEGIN TRANSACTION;
LOCK TABLE humanresources.department IN ROW EXCLUSIVE MODE;
COMMIT;
Aby wyświetlić blokady, które są obecnie przechowywane w bazie danych, użyj pg_locks. Aby na przykład wyświetlić wszystkie bieżące blokady, użyj następującego polecenia:
SELECT * FROM pg_locks;