Вопрос проверяет понимание границ транзакций и рисков при взаимодействии с внешними системами.
Транзакции в БД не распространяются на внешние системы. Если внутри транзакции выполняется внешний вызов, система может зависнуть или попасть в неконсистентное состояние. При сбое внешнего сервиса транзакция удерживает ресурсы БД слишком долго. Это приводит к блокировкам и деградации производительности.
Транзакция гарантирует атомарность только внутри базы данных, но не за её пределами.
Прежде чем перечислять риски, важно понимать: внешний вызов не участвует в транзакции БД.
Долгоживущие транзакции
ожидание ответа внешнего сервиса
удержание блокировок
рост contention в БД
Нарушение атомарности
БД обновилась
внешний сервис не ответил
состояние системы стало частично обновлённым
Сложность повторов
нельзя безопасно повторить запрос
внешний вызов может быть неидемпотентным
Проблемы масштабирования
рост числа блокировок
деградация под нагрузкой
with transaction():
update_balance()
call_external_service() # вне границ транзакции БД
вынос внешних вызовов за пределы транзакции
outbox pattern
асинхронная обработка
компенсационные операции
Транзакции и внешние вызовы плохо сочетаются напрямую и требуют архитектурных паттернов для безопасной интеграции.