System Design Space
Граф знанийНастройки

Обновлено: 25 марта 2026 г. в 03:00

Distributed Transactions: 2PC и 3PC

hard

Практический разбор распределённых транзакций: coordinator, prepare/commit phases, failure modes, blocking trade-offs и альтернативы через Saga/outbox.

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

В реальной инженерной работе эта глава помогает выбирать между 2PC, 3PC, Saga и outbox не по красоте схемы, а по границам домена, допустимым failure-сценариям, blocking-поведению и цене координации.

В интервью, review и архитектурных разговорах она особенно полезна, когда нужно честно проговорить timeout semantics, partial commit, компенсации и требования к идемпотентности, а не просто сказать distributed transaction.

Практическая польза главы

Практика проектирования

Учит выбирать транзакционный паттерн по границам домена и допустимым failure-сценариям.

Качество решений

Помогает сравнить 2PC/3PC/Saga через latency, блокировки и операционную сложность.

Interview-аргументация

Дает ясную схему объяснения coordinator/participants, commit-point и recovery пути.

Риски и компромиссы

Делает явными trade-offs: blocking, partial commit, timeout semantics и idempotency requirements.

Контекст

Консистентность и идемпотентность

Distributed transactions - один из способов обеспечить согласованность, но не единственный.

Открыть главу

Distributed Transactions (2PC/3PC) нужны, когда бизнес-инвариант требует согласованного изменения нескольких независимых ресурсов. Цена этого выбора - задержки, блокировки и сложная recovery-логика при частичных отказах.

Когда вообще нужен distributed transaction

  • Одна бизнес-операция затрагивает несколько независимых ресурсов/сервисов.
  • Нельзя принять временную рассогласованность для конкретного класса операций.
  • Ошибка частичного коммита приводит к существенным финансовым/регуляторным рискам.

2PC flow

2PC: двухфазный commit

Prepare -> votes -> global decision (commit/abort)

Координатор собирает голоса участников и принимает единое решение commit/abort для всей транзакции.

Сильные стороны

  • Простая и понятная модель координации.
  • Чётко отделяет фазу подготовки от финального решения.

Риски

  • Блокировки при отказе координатора в неподходящий момент.
  • Высокая чувствительность к timeout/retry настройкам.

Шаги протокола

Текущая команда

Нажмите Старт, чтобы проиграть протокол по шагам.

Координатор

Ожидает запуск

Команд от координатора: 0

Участники

3 участника

Активен шаг: 0 / 8

Заказы

участник A

Ожидание команд

Задействован в шагах: 0

Платежи

участник B

Ожидание команд

Задействован в шагах: 0

Склад

участник C

Ожидание команд

Задействован в шагах: 0

3PC flow

3PC: трёхфазный commit

CanCommit -> PreCommit -> DoCommit

Добавляет промежуточную фазу pre-commit, чтобы уменьшить риск блокировок при проблемах координатора.

Сильные стороны

  • Снижает вероятность зависания в неопределённом состоянии.
  • Явно разделяет намерение и финальный commit.

Риски

  • Больше сетевых раундов и более сложная state machine.
  • Требует очень аккуратной настройки timeout и recovery.

Шаги протокола

Текущая команда

Нажмите Старт, чтобы проиграть протокол по шагам.

Координатор

Ожидает запуск

Команд от координатора: 0

Участники

3 участника

Активен шаг: 0 / 12

Заказы

участник A

Ожидание команд

Задействован в шагах: 0

Платежи

участник B

Ожидание команд

Задействован в шагах: 0

Склад

участник C

Ожидание команд

Задействован в шагах: 0

Alternative

Event-Driven Architecture

Во многих сценариях Saga + outbox даёт лучший balance, чем глобальный 2PC/3PC.

Открыть главу

Trade-offs и альтернативы

2PC прост в концепции, но может блокировать систему при отказе координатора.

3PC уменьшает вероятность блокировок, но добавляет сетевые раунды и сложность state machine.

Оба подхода чувствительны к network partition, timeout tuning и корректной recovery-логике.

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

Saga (orchestration/choreography)

Разбивает транзакцию на локальные шаги с compensating actions вместо глобального lockstep commit.

Transactional outbox

Гарантирует согласованность локальной БД и публикации события без distributed XA-транзакции.

Idempotent commands + reconciliation

Повторяемые операции и фоновое выравнивание состояния уменьшают последствия partial failure.

Domain redesign

Иногда дешевле изменить границы агрегатов и убрать cross-service atomic requirement.

Практический чеклист

  • Явно определено, где нужна strict atomicity, а где приемлема eventual consistency.
  • Есть coordinator recovery strategy и durable transaction log.
  • Timeout policies протестированы для partition/delay сценариев.
  • Все участники поддерживают idempotent commit/abort обработку.
  • Есть бизнес-механизм компенсации и ручного разрешения спорных кейсов.

Частый anti-pattern: вводить 2PC между сервисами без оценки блокировок, retry-модели и recovery-стоимости.

References

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки