Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Node.js: distributed transaction, consistency, two-phase commit, saga pattern, microservices

Что такое распределённая транзакция?

Проверяет понимание распределённых транзакций, их необходимости и проблем согласованности данных в микросервисной архитектуре.

Короткий ответ

Распределённая транзакция — это операция, которая затрагивает несколько независимых баз данных или сервисов. Она требует координации для обеспечения атомарности и согласованности данных. Обычно реализуется через двухфазный коммит или паттерн Saga. Это важно для микросервисов, где данные распределены.

Длинный ответ

Что такое распределённая транзакция?

Распределённая транзакция — это набор операций, выполняемых над данными в разных системах (базах данных, сервисах), которые должны быть выполнены атомарно: либо все успешно, либо ни одна. В монолитных приложениях транзакции управляются одной базой данных, но в микросервисной архитектуре данные часто распределены, и требуется координация.

Проблемы и подходы

Основная проблема — обеспечение ACID (атомарность, согласованность, изоляция, долговечность) в распределённой среде. Два популярных подхода:

  • Двухфазный коммит (2PC): координатор опрашивает участников, готовы ли они выполнить операцию, затем отправляет команду на фиксацию. Минус — блокировка ресурсов и риск отказа координатора.
  • Паттерн Saga: разбивает транзакцию на последовательность локальных транзакций с компенсирующими действиями при ошибке. Более гибкий, но требует ручной обработки компенсаций.

Пример кода (Saga на Node.js)

class Saga {
  constructor() {
    this.steps = [];
  }
  addStep(execute, compensate) {
    this.steps.push({ execute, compensate });
  }
  async run() {
    const executed = [];
    for (const step of this.steps) {
      try {
        await step.execute();
        executed.push(step);
      } catch (err) {
        for (const s of executed.reverse()) {
          await s.compensate();
        }
        throw err;
      }
    }
  }
}
// Использование:
const saga = new Saga();
saga.addStep(
  () => db1.update({ id: 1, amount: -100 }),
  () => db1.update({ id: 1, amount: 100 })
);
saga.addStep(
  () => db2.update({ id: 2, amount: 100 }),
  () => db2.update({ id: 2, amount: -100 })
);
saga.run();

Вывод

Распределённые транзакции необходимы в системах с несколькими источниками данных. Для высоконагруженных микросервисов чаще используют Saga из-за его асинхронности и отсутствия блокировок, хотя 2PC подходит для строгих требований к согласованности.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Node.js

    Node.js

  • Networks

Ключевые слова

#distributed transaction

#consistency

#two-phase commit

#saga pattern

#microservices

Подпишись на Java Developer в телеграм