Mam zapytanie wsadowe, które codziennie uruchamiam w mojej bazie danych. Wydaje się jednak, że utknął w stanie bezczynności i mam duże trudności z debugowaniem tego, co się dzieje.
Zapytanie to agregacja w tabeli, która jest jednocześnie wstawiana, co, jak sądzę, w jakiś sposób odnosi się do problemu. (Agregacja dotyczy danych z poprzednich dni, więc wstawki nie powinny wpływać na wyniki).
Wskazówki
Używam tego w skrypcie Pythona za pomocą narzędzia sqlalchemy. Jednak ustawiłem poziom transakcji na automatyczne zatwierdzanie, więc nie sądzę, żeby coś się zapakowało w transakcję. Z drugiej strony nie widzę, aby zapytanie zawiesiło się, gdy uruchomię je ręcznie w terminalu sql.
Przez zapytanie
pg_stat_activity
zapytanie początkowo trafia do bazy danych jakostate='active'
. Po około 15 sekundach stan zmienia się na „bezczynny” i dodatkowoxact_start
ustawiony jest naNULL
. Flaga oczekiwania nigdy nie jest ustawiona na wartość true.Zanim zorientowali się trybu automatycznego poziomie transakcji dla SQLAlchemy, to zamiast spędzać czas w stanie
'idle in transaction'
zamiast'idle'
. A może od czasu wprowadzenia tej zmiany zawiesza się nieco rzadziej?
Mam wrażenie, że nie jestem w stanie kopać głębiej niż na tym. Wszelkie informacje zwrotne, nawet wyjaśniające więcej o różnych stanach i istotnych elementach wewnętrznych postgresu, bez jednoznacznej odpowiedzi, byłyby bardzo mile widziane.
źródło
COMMIT
zostało wydane żadne polecenie zakończenia transakcji. Wygląda na to, że Twój problem może dotyczyćOdpowiedzi:
Pierwszą rzeczą, którą musisz tutaj rozdzielić, są słowa zapytanie , transakcja i połączenie .
Wskazówka: zapytanie zostanie wykonane - jest w stanie aktywnym. Następnie zapytanie kończy się, ale połączenie pozostaje włączone - stan bezczynności. Nie ma transakcji (została zatwierdzona), więc
xact_start
jest zerowa. Musisz więc zamknąć połączenie po pomyślnym zakończeniu zapytania.Wskazówka: przed włączeniem automatycznego zatwierdzania zapytanie zostało pozostawione w środku transakcji, więc najpierw musisz to zrobić,
commit
a potemclose connection
.źródło