ROLLBACK базы не отменяет уже отправленный внешний запрос
ROLLBACK базы не отменяет уже отправленный внешний запрос Сценарий: изменение в БД → внешний вызов → deadlock_detected, 40P01 → rollback → retry PostgreSQL завершает одну из транзакций, чтобы разрешить deadlock. Но внешний эффект мог уже произойти — либо его результат мог остаться неизвестным из-за потерянного ответа. Поэтому retry должен учитывать не только SQL. Что проверить: — повторяется ли вся локальная транзакция, а не последний statement; — есть ли внешние вызовы внутри повторяемого блока; — ограничено ли число retry; — используется ли backoff; — стабилен ли идемпотентный ключ; — умеет ли получатель распознавать повтор; — подходит ли outbox для публикации после commit; — идемпотентен ли consumer. Transactional outbox связывает изменение данных и запись события одной транзакцией. Но последующая публикация может повториться, поэтому exactly-once он не гарантирует. Вывод: безопасный retry проектируется на уровне бизнес-операции, а не только транзакции PostgreSQL. #УЦФОРС #PostgreSQL #Backend #АрхитектураПО #Транзакции