load_heat_reserves открывал сессию, проходил по восьми организациям — у каждой
несколько HTTP-раундов к медленному внешнему реестру ФАС с таймаутом 60с — и
коммитил ОДИН раз в самом конце. Одна транзакция оставалась открытой на всё это
время: держала соединение, тормозила vacuum, а падение в конце обнуляло бы всё
уже собранное.
Тонкость, из-за которой наивная правка была бы неверной: функция умеет принимать
ЧУЖУЮ сессию (аргумент db). На ней коммитить по ходу нельзя — транзакцией
распоряжается вызывающий, и промежуточный commit зафиксировал бы его работу. То
же правило, что для плоского rollback на общей сессии. Поэтому по-организационный
commit только под owns_session; на чужой сессии поведение прежнее.
Сбойная организация теперь ещё и откатывается, чтобы её частичные записи не
уезжали в коммит следующей.
Про достижимость: загрузчик живой — 119 строк, 64 системы, последняя загрузка
18.08 (такт недельный, heat-reserves-sync-weekly).
Тесты считают коммиты на сессии-двойнике, то есть проверяют поведение. Против
origin/main:
на своей сессии 1 коммит при 8 организациях → падает
частичные записи сбойной организации не откачены → падает
на ЧУЖОЙ сессии промежуточных коммитов нет — контроль, зелёный обе стороны
Контроль не для симметрии: он ловит ровно ту наивную правку, что коммитила бы
чужую транзакцию.
Прогоны: -k "heat or capacity" — 117 passed rc=0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>