Nie. DO AKTUALIZACJI blokuje tylko te wiersze , aby kolejna transakcja, która próbuje je zablokować (za pomocą FOR SHARE , DO AKTUALIZACJI , AKTUALIZUJ lub USUŃ ) blokuje się, dopóki transakcja nie zostanie zatwierdzona lub wycofana.
Jeśli chcesz zablokować całą tabelę, która blokuje wstawianie/aktualizacje/usuwanie, prawdopodobnie chcesz ZABLOKOWAĆ TABELĘ ... W TRYBIE WYŁĄCZNOŚCI .
-
Zobacz
lock_timeout ustawienie. Zostało to dodane w wersji 9.3 i nie jest dostępne w starszych wersjach.Przybliżone przybliżenia dla starszych wersji można uzyskać za pomocą
statement_timeout, ale może to prowadzić do niepotrzebnego anulowania instrukcji. Jeślistatement_timeoutwynosi 1 s, a instrukcja czeka 950 ms na blokadzie, może następnie uzyskać blokadę i kontynuować, tylko po to, aby zostać natychmiast anulowana przez przekroczenie limitu czasu. Nie to, czego chcesz.Nie ma sposobu na poziomie zapytania, aby ustawić
lock_timeout, ale możesz i powinien po prostu:USTAW LOKALNY lock_timeout ='1s';po tobie
POCZĄTEKtransakcja. -
Jest oświadczenie limit czasu, ale blokady są utrzymywane w transakcji poziom. Nie ma funkcji limitu czasu transakcji.
Jeśli prowadzisz transakcje jednowyciągowe, możesz po prostu ustawić
statement_timeoutprzed uruchomieniem instrukcji, aby ograniczyć czas jej działania. Nie jest to jednak to samo, co ograniczanie tego, jak długo może utrzymać blokadę, ponieważ może czekać 900 ms z dozwolonych 1 s na blokadę, tylko faktycznie trzymać blokadę przez 100 ms, a następnie zostać anulowane przez limit czasu. -
Nie. Musisz:
BEGIN; SET LOCAL lock_timeout = '4s'; SELECT ....; COMMIT; -
USTAW LOKALNYjest odpowiedni i preferowany do tego.Nie można tego zrobić w tekście zapytania, musi to być osobna instrukcja.
Post na liście dyskusyjnej, do którego prowadziłeś link, jest propozycją wyimaginowanej składni, która nigdy nie została zaimplementowana (przynajmniej w publicznym wydaniu PostgreSQL) i nie istnieje.
W takiej sytuacji możesz rozważyć „optymistyczną kontrolę współbieżności”, często nazywaną „optymistycznym blokowaniem”. Daje to większą kontrolę nad zachowaniem blokowania kosztem zwiększonych częstotliwości powtarzania zapytań i potrzeby większej logiki aplikacji.