PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Kontrolowanie czasu oczekiwania na blokadę PostgreSQL

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 .

  1. 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śli statement_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.

  2. 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.

  3. Nie. Musisz:

    BEGIN;
    SET LOCAL lock_timeout = '4s';
    SELECT ....;
    COMMIT;
    
  4. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertujesz kolumny pandy na listę PostgreSQL?

  2. Jak utworzyć tablicę Postgresql JSONB w indeksie tablicy?

  3. jsonb vs jsonb[] dla wielu adresów dla klienta

  4. []string do jsonb z Gorm i postgres

  5. BeanCreationException:Błąd podczas tworzenia fasoli o nazwie „flywayInitializer”