У меня есть пакетный запрос, который я ежедневно выполняю в своей базе данных. Тем не менее, похоже, что он застрял в режиме ожидания, и мне очень трудно отлаживать происходящее.
Запрос представляет собой агрегацию для таблицы, которая одновременно вставляется, что, я думаю, как-то связано с этой проблемой. (Агрегирование данных за предыдущие дни, поэтому вставки не должны влиять на результаты.)
Улики
Я запускаю это внутри скрипта Python, используя sqlalchemy. Тем не менее, я установил уровень транзакции для автоматической фиксации, так что я не думаю, что что-то запутывается внутри транзакции. С другой стороны, я не вижу зависания запроса, когда запускаю его вручную в терминале sql.
При запросе
pg_stat_activity
запрос изначально поступает в базу данных какstate='active'
. Примерно через 15 секунд состояние меняется на «режим ожидания» и дополнительноxact_start
устанавливается наNULL
. Флаг ожидания никогда не устанавливается в true.Прежде чем я понял, AutoCommit уровня транзакций для SQLAlchemy, было бы вместо этого повесить в состоянии ,
'idle in transaction'
а не'idle'
. И это может зависать немного реже после внесения этого изменения?
Я чувствую, что я не в состоянии копать глубже, чем я на этом. Будем весьма благодарны за любые отзывы, даже более подробно объясняющие различные состояния и соответствующие внутренние компоненты postgres, но не дающие однозначного ответа.
источник
COMMIT
для завершения транзакции не было выдано ни одного запроса . Похоже, ваша проблема может быть не в БД, а в другом местеОтветы:
Первое, что вы должны выделить здесь, это слова запрос , транзакция и соединение .
Подсказка: ваш запрос выполняется - он находится в активном состоянии. После этого запрос заканчивается, но соединение остается - состояние ожидания. Нет транзакции (она была зафиксирована), поэтому она
xact_start
является нулевой. Поэтому вы должны закрыть соединение после успешного выполнения запроса.Подсказка: до того, как автокоммит был включен, запрос был оставлен в середине транзакции, поэтому сначала вам нужно будет,
commit
а затемclose connection
.источник