Postgres: Automatyczne przerywanie zapytania po przekroczeniu wartości progrowych

15-lis-2020

Postgres pozwala zdefiniować progi wybranych liczników, po przekroczeniu których, aktywność użytkownika może być usunięta z serwera. Kilka z nich to:

  • deadlock_timeout – czas po jakim zapytanie oczekujące na zwolnienie deadlock ma się „poddać”. Domyślna wartość to 1000 ms. Użytkownik może przedefiniować ten parametr
  • statement_timeout – czas po jakim długo wykonujące się polecenie ma się przerwać. Można je ustawić globalnie lub dla wybranej funkcji. Domyślna wartość zero oznacza, że takiego limitu nie ma
  • lock_timeout – czas po jakim długo trwające oczekiwanie na lock ma się przerwać. Ponieważ update statements muszą w pierwszej kolejności uzyskać lock na modyfikowanych rekordach, to lock_timeout powienien być mniejszy niż statement_timeout. Domyślnie ta wartość wynosi zero, co znaczy, że czekanie odbywa się bez limitu. Parametr ustawia się na sesję lub dla funkcji.
  • idle_in_transaction_session_timeout – maksymalny czas, przez jaki może trwać transakcja nie podejmując żadnych nowych czynności. Jeśli ten czas zostanie przekroczony, to transakcja zostanie wycofana. Domyślna wartość zer określa, że nie ma żadnego limitu.

Technicznie zmiana parametru jest wykonywana poleceniem

SET configuration_parameter TO values;

Jeśli więc jedna sesja wykonała polecenie:

START TRANSACTION;

DELETE FROM rental WHERE rental_id=2

a druga wykona:

START TRANSACTION;
 
 SET lock_timeout TO 5000;
 
 UPDATE rental SET last_update = NOW() WHERE rental_id = 2

to po ok. 5 sekundach otrzymasz błąd w sesji drugiej:

ERROR: canceling statement due to lock timeout
CONTEXT: while locking tuple (0,1) in relation „rental”
SQL state: 55P03

Aby przywrócić oryginalną wartość parametru wystarczy wykonać:

SET lock_timeout TO values;

Komentarze są wyłączone

Autor: Rafał Kraik