Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как правильно организовать транзакции между методами?

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

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

Транзакции между методами организуются с помощью паттернов Saga или Two-Phase Commit. Saga разбивает операцию на шаги с компенсирующими действиями при ошибке. Two-Phase Commit использует координатор для атомарного выполнения. В микросервисах чаще применяют Saga из-за лучшей масштабируемости.

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

Основы транзакций между методами

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

Паттерн Saga

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

// Пример Saga на Node.js
async function createOrderSaga(orderData) {
  try {
    const order = await orderService.create(orderData);
    const payment = await paymentService.charge(order.id, orderData.amount);
    const inventory = await inventoryService.reserve(orderData.items);
    return { order, payment, inventory };
  } catch (error) {
    // Компенсации
    if (inventory) await inventoryService.release(orderData.items);
    if (payment) await paymentService.refund(order.id);
    if (order) await orderService.cancel(order.id);
    throw error;
  }
}

Two-Phase Commit (2PC)

2PC использует координатор, который сначала опрашивает участников (prepare), затем фиксирует (commit). Это обеспечивает атомарность, но снижает производительность и требует блокировок.

Выбор подхода

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

Вывод: используйте Saga для распределенных систем с высокой нагрузкой, а 2PC — для небольших кластеров с требованиями строгой ACID.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Node.js

    Node.js

  • Networks

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

#transaction

#distributed systems

#ACID

#two-phase commit

#saga pattern

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