Back to questions
Junior
6
Синхронный вызов внешнего сервиса внутри транзакции — нормально ли это?
Companies where asked
СБК ПАРУС
Answer from AI
sobes.tech AI
Синхронный вызов внешнего сервиса внутри транзакции обычно считается плохой практикой. Причины:
- Транзакция блокирует ресурсы (например, таблицы или строки в базе) до её завершения, а внешний вызов может быть медленным или ненадёжным.
- Если внешний сервис работает медленно или недоступен, транзакция будет висеть, что ухудшит производительность и может привести к дедлокам.
- В случае отката транзакции сложно откатить или компенсировать вызов внешнего сервиса.
Лучше:
- Минимизировать время транзакции, выполняя внешние вызовы вне транзакции.
- Использовать асинхронные механизмы, очереди сообщений или паттерны с компенсацией.
Пример плохой практики:
@Transactional
public void process() {
// обновление данных в БД
repository.update(...);
// синхронный вызов внешнего сервиса
externalService.call();
}
Лучше разделить на две части: сначала транзакция с обновлением, потом вызов сервиса.