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_timeout
wynosi 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ĄTEK
transakcja. -
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_timeout
przed 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 LOKALNY
jest 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.