Назад к задачам
Альфа-БанкПолучайте помощь с лайвкодингом в реальном времени с Sobes Copilot
Junior — Senior
3
Непоследовательность транзакции: запись в БД и отправка HTTP‑запроса
Компании, где спрашивали:
Условие задачи
В примере показан код, который сохраняет вычисленное значение в базу данных и сразу после этого пытается отправить его во внешнюю систему через HTTP‑запрос. Операция выглядит атомарной, однако реальная атомарность нарушается: запись в БД происходит в рамках транзакции, а сетевой запрос выполняется уже после её завершения. При падении сетевого вызова запись уже зафиксирована, и система может оказаться в неконсистентном состоянии.
@Transactional
public void calculate(GetFilesInfoRequest request) {
double divisor = 6.85;
double commissionRate = 5.2534;
double result = (count * commissionRate) / divisor;
repo.save(result);
try {
// HTTP POST
notifier.sendCalculate(result);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
Задача — обсудить, почему такой подход не гарантирует атомарность, какие могут возникнуть проблемы и как их решить (например, использовать двухфазную фиксацию, outbox‑pattern, компенсационные транзакции и т.п.).