Sobes.tech
Назад к вопросам
Junior
7

Синхронный вызов внешнего сервиса внутри транзакции — нормально ли это?

Компании, где спрашивали
СБК ПАРУС

Ответ от нейросети

sobes.tech AI

Синхронный вызов внешнего сервиса внутри транзакции обычно считается плохой практикой. Причины:

  • Транзакция блокирует ресурсы (например, таблицы или строки в базе) до её завершения, а внешний вызов может быть медленным или ненадёжным.
  • Если внешний сервис работает медленно или недоступен, транзакция будет висеть, что ухудшит производительность и может привести к дедлокам.
  • В случае отката транзакции сложно откатить или компенсировать вызов внешнего сервиса.

Лучше:

  • Минимизировать время транзакции, выполняя внешние вызовы вне транзакции.
  • Использовать асинхронные механизмы, очереди сообщений или паттерны с компенсацией.

Пример плохой практики:

@Transactional
public void process() {
    // обновление данных в БД
    repository.update(...);
    // синхронный вызов внешнего сервиса
    externalService.call();
}

Лучше разделить на две части: сначала транзакция с обновлением, потом вызов сервиса.