Gernar
Frontend DeveloperHTTP, API и данные

Интервью-вопрос

Что такое транзакция

Транзакция нужна, чтобы несколько связанных изменений применялись как одно действие. Для фронтенда важно понимать, когда показывать успех, как обрабатывать откат и почему повтор запроса может создать дубль.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

Как лучше коротко объяснить транзакцию?

Вас просят дать базовое определение без глубокого ухода в БД.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Транзакция защищает систему от частично примененных изменений. Представьте перевод денег. Нужно списать сумму с одного счета и зачислить на другой. Если списание прошло, а зачисление нет, данные стали неконсистентными.

Поэтому короткий ответ можно дать так: транзакция объединяет несколько операций в одно надежное действие. Результат либо фиксируется полностью, либо полностью отменяется.

Классический SQL-пример выглядит так:

BEGIN;

UPDATE accounts
SET balance = balance - 100
WHERE id = 1;

UPDATE accounts
SET balance = balance + 100
WHERE id = 2;

COMMIT;

Если между двумя UPDATE произошла ошибка, сервер должен сделать ROLLBACK. Практический смысл простой. Пользователь не должен получить состояние, где деньги уже списались, но не дошли до получателя.

Что такое ACID

ACID это набор гарантий, которыми часто описывают транзакции.

  • Atomicity: все операции применяются или все отменяются.
  • Consistency: данные переходят из одного валидного состояния в другое.
  • Isolation: параллельные транзакции не должны ломать результат друг друга.
  • Durability: после фиксации результат сохраняется даже при сбое.

На интервью не нужно читать лекцию про каждый уровень изоляции. Достаточно показать, что транзакция нужна не для удобства кода, а для защиты целостности данных.

Как выбрать ответ на интервью

Для Frontend Developer лучше не ограничиваться фразой, что это тема бэкенда. Дайте определение, приведите пример и сразу покажите, как транзакции влияют на клиентский код.

Как построить ответ

1Вопрос общий и вас просят дать определение?
Начните с правила all or nothing и коротко назовите ACID.
2Просят пример из веб-разработки?
Возьмите заказ, оплату или перевод денег. В таких сценариях нельзя применить только часть изменений.
3Спрашивают про роль фронтенда?
Скажите про корректную обработку статусов, повторов, rollback optimistic UI и понятные сообщения об ошибке.
4Разговор ушел в микросервисы?
Отделите ACID в одной БД от Saga, компенсаций и eventual consistency между сервисами.

Почему это важно для фронтенда

Фронтенд обычно не открывает транзакцию в базе данных. Он вызывает API, а сервер уже решает, какие изменения выполнить внутри BEGIN, COMMIT и ROLLBACK или через другой механизм.

Но клиент отвечает за состояние экрана. Если вы сразу показываете успех после клика, а сервер потом откатывает операцию, пользователь увидит ложный результат. Если вы разрешаете повторный submit без защиты, можно создать два заказа или две попытки оплаты. Если запрос завершился таймаутом, результат неизвестен. Сервер мог уже зафиксировать изменения.

Где транзакции видны в пользовательском сценарии

Оформление заказаorder + stock + payment

Показывайте успех только после финального ответа сервера. Иначе пользователь увидит заказ, который откатился из-за товара или оплаты.

Перевод денегdebit + credit

Не делайте локальный баланс источником истины. После ответа сервера обновите оба счета из подтвержденных данных.

Optimistic UIrollback

Можно временно обновить экран, но нужен откат и понятное сообщение, если транзакция не прошла.

Повтор запросаidempotency key

При таймауте пользователь может нажать кнопку еще раз. Отключенная кнопка помогает только на текущем экране. Защиту от дублей должен давать API.

Неясный результатrefetch status

Если сеть оборвалась после отправки, не показывайте финальный успех или отмену наугад. Запросите статус операции или перечитайте данные.

Плохой фронтенд-паттерн: считать, что клик уже означает успешную операцию.

// Плохо: success показан до ответа сервера
async function submitOrder() {
  setStatus("success");
  await api.createOrder(form);
}

Если сервер откатит создание заказа из-за оплаты или остатков на складе, интерфейс уже сообщил пользователю неправду. Еще один риск: пользователь нажмет кнопку повторно и создаст дубль, если API не защищает операцию идемпотентно. Безопаснее показывать загрузку, блокировать повторный submit в UI, ждать подтверждения сервера, а при ошибке возвращать экран в понятное состояние.

async function submitOrder() {
  setStatus("loading");

  try {
    const order = await api.createOrder(form, {
      idempotencyKey: draftId,
    });
    setOrder(order);
    setStatus("success");
  } catch (error) {
    setStatus("error");
    showMessage("Заказ не создан. Проверьте статус и попробуйте еще раз.");
  }
}

Ключ идемпотентности должен быть стабильным для одной попытки создать заказ. Если генерировать новый ключ на каждый повтор, защита от дублей не сработает.

В интерфейсе это стоит поддержать нативным состоянием кнопки и сообщением об ошибке. Так пользователь не отправит форму случайно второй раз и услышит ошибку в скринридере.

<button type="submit" disabled={status === "loading"}>
  {status === "loading" ? "Создаем заказ..." : "Оформить заказ"}
</button>

{status === "error" && <p role="alert">Заказ не создан.</p>}

REST API, идемпотентность и повторы

Один POST /orders может выглядеть для клиента как одно действие, но внутри сервер может создать заказ, зарезервировать товар и запустить оплату. Эти шаги должны быть согласованы на сервере.

Отдельная проблема для фронтенда это повтор. Пользователь может потерять сеть, не получить ответ и нажать кнопку снова. Если операция не идемпотентна, повтор может создать дубль. Поэтому для платежей и заказов часто используют Idempotency-Key или другой серверный механизм защиты от повторной обработки.

Важно: отмена клиентского запроса через AbortController не означает автоматический откат серверной транзакции. Она только прекращает ожидание ответа на клиенте. После такого сценария безопаснее перечитать данные или запросить статус операции, а не показывать финальный результат наугад.

Что можно сказать на интервью:

Я понимаю, что фронтенд не гарантирует транзакционность базы. Но я должен учитывать контракт API: не показывать финальный успех до подтверждения, защищать форму от двойной отправки, корректно обрабатывать таймауты и делать rollback, если использую optimistic UI.

Микросервисы и распределенные операции

В одной базе данных транзакцию обычно проще контролировать. В микросервисной системе действие может проходить через сервис заказа, платежный сервис, склад и уведомления. У них могут быть разные базы и разные сбои.

Поэтому строгая ACID-транзакция между всеми сервисами часто оказывается слишком дорогой или сложной. На практике используют Saga. Каждый шаг выполняется отдельно, а при ошибке запускаются компенсирующие действия. Например, если оплата прошла, но резерв товара не удался, систему нужно привести к безопасному состоянию. Для пользователя это может выглядеть как отмена оплаты или возврат денег.

Важно не обещать, что Saga полностью равна SQL-транзакции. Она помогает управлять процессом, но часто дает eventual consistency. Для фронтенда это значит, что часть операций может быть в статусе обработки, ожидания подтверждения или отмены. Интерфейс должен честно показывать этот статус.

Практический вывод

Сильный ответ на этот вопрос состоит из трех частей.

  1. Дайте определение: транзакция фиксирует все операции или откатывает все.
  2. Назовите ACID и пример: перевод денег, заказ, оплата, резерв товара.
  3. Свяжите с фронтендом: состояние загрузки, ошибка, rollback optimistic UI, защита от повторов, обработка таймаута и доверие к API-контракту.

Такой ответ показывает, что вы понимаете и базовую теорию, и последствия для пользовательского интерфейса.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Сводить транзакцию к нескольким запросам

    Несколько запросов подряд не дают атомарности сами по себе. Если первый запрос изменил данные, а второй упал, система может остаться в частично примененном состоянии. В ответе лучше сказать, что транзакция требует явной фиксации или отката на стороне БД или серверной логики.

  2. 2

    Забывать про роль фронтенда

    Клиент обычно не управляет COMMIT и ROLLBACK, но он управляет ожиданием, повторами, блокировкой кнопок и откатом UI. Если это не учитывать, пользователь может увидеть успех, отправить форму дважды или потерять доверие к интерфейсу.

  3. 3

    Повторять запрос до успеха без идемпотентности

    Если сеть оборвалась, серверная транзакция могла уже зафиксироваться. Автоматические повторы до 200 могут создать два заказа, две оплаты или два списания. Безопаснее использовать идемпотентный ключ, endpoint статуса операции или повторную загрузку подтвержденных данных.

  4. 4

    Обещать ACID в микросервисах без оговорок

    Между несколькими сервисами сложно получить такие же гарантии, как внутри одной SQL-транзакции. Если не сказать про Saga, компенсации и идемпотентность, ответ будет звучать слишком упрощенно.

  5. 5

    Игнорировать параллельные действия

    Два пользователя могут одновременно купить последний товар или отправить одну форму несколько раз. В ответе стоит упомянуть изоляцию, блокировки или серверную проверку конфликтов. Только фронтенд-защита такие гонки не решает.

  6. 6

    Считать успешный HTTP-статус доказательством транзакции

    200 или 201 говорит только о контракте конкретного API. Если сервер плохо реализован, часть изменений могла быть применена без настоящей транзакции. На интервью лучше сказать, что фронтенд доверяет API-контракту, но транзакционные гарантии должны быть описаны и реализованы на сервере.

Follow-up

Что могут спросить дальше

Короткие ответы на уточнения про ACID, API, повторы и роль фронтенда в транзакционных сценариях.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание