В транзакции уже была ошибка, и PostgreSQL игнорирует следующие команды
«ERROR: current transaction is aborted, commands ignored until end of transaction block» (SQLSTATE 25P02) в PostgreSQL: это не причина, а следствие. Настоящая ошибка случилась раньше в той же транзакции. Как её найти.
Что это значит
Если внутри транзакции одна команда завершилась ошибкой, PostgreSQL помечает всю транзакцию как прерванную и отклоняет все следующие команды этой ошибкой, пока клиент не выполнит ROLLBACK. Поэтому сама эта ошибка ничего не объясняет: причина в первой ошибке транзакции.
Частая картина в журналах: одна настоящая ошибка и за ней десятки current transaction is aborted от той же сессии. Так ведут себя программы, которые не проверяют результат команды и продолжают работу, например инструменты миграции или скрипты, перебирающие варианты запросов.
Как проверить
- Найти в журнале PostgreSQL первую ошибку той же сессии перед этой: по номеру процесса в префиксе строки журнала.
- Если в журнале нет нужного, включить префикс с идентификатором сессии:
log_line_prefix = '%m [%p] %u@%d 'или подобный.
Что сделать
- Разбирать первую ошибку, а эти считать её следствием.
- В своём коде после ошибки внутри транзакции выполнять
ROLLBACKили откатываться к точке сохранения (SAVEPOINT), прежде чем продолжать.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать