Omówienie blokowania

Ukończone

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;