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

Обновлено: 26 апреля 2026 г. в 10:27

Распределённые транзакции: 2PC и 3PC

сложный

Практический разбор распределённых транзакций: координатор и участники, двухфазная и трёхфазная фиксация, блокировки, частичные сбои и альтернативы через Saga и транзакционный журнал исходящих событий.

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

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

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

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

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

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

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

Помогает сравнить двухфазную фиксацию, трёхфазную фиксацию и Saga через задержку, блокировки и операционную сложность.

Аргументация на интервью

Дает ясную схему объяснения координатора, участников, точки фиксации и пути восстановления.

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

Делает явными блокировки, частичную фиксацию, семантику тайм-аутов и требования к идемпотентности.

Контекст

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

Распределённые транзакции — один из способов удержать согласованность, но не единственный.

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

нужна, когда важнее автономности отдельных сервисов. В таких сценариях важны , , , , и .

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

Цена проявляется при , , и . Поэтому рядом с протоколами фиксации часто проектируют , , , , , , и обработку .

Распределённые транзакции: 2PC и 3PC нужны, когда бизнес-инвариант требует согласованного изменения нескольких независимых ресурсов. Цена такого выбора — задержки, блокировки и сложное восстановление после частичных отказов.

Когда нужна распределённая транзакция

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

Как работает двухфазная фиксация (2PC)

2PC: двухфазная фиксация

Prepare -> голоса участников -> общее решение COMMIT/ABORT

Координатор собирает голоса участников и принимает единое решение: зафиксировать или отменить всю транзакцию.

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

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

Риски

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

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

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

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

Координатор

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

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

Участники

3 участника

Шаг: 0 / 8

Заказы

участник A

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

Участвовал в шагах: 0

Платежи

участник B

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

Участвовал в шагах: 0

Склад

участник C

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

Участвовал в шагах: 0

Как работает трёхфазная фиксация (3PC)

3PC: трёхфазная фиксация

CanCommit -> PreCommit -> DoCommit

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

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

  • Снижает вероятность зависания в неопределённом состоянии.
  • Явно разделяет намерение зафиксировать изменения и финальную команду.

Риски

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

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

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

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

Координатор

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

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

Участники

3 участника

Шаг: 0 / 12

Заказы

участник A

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

Участвовал в шагах: 0

Платежи

участник B

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

Участвовал в шагах: 0

Склад

участник C

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

Участвовал в шагах: 0

Альтернатива

Event-Driven Architecture

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

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

Компромиссы и альтернативы

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

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

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

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

Saga: оркестрация или хореография

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

Транзакционный журнал исходящих событий

Записывает событие рядом с бизнес-изменением в локальной БД, а публикует его позже безопасным воркером.

Идемпотентные команды и согласование состояния

Безопасные повторы и фоновая сверка уменьшают последствия частичных сбоев.

Пересмотр границ домена

Иногда дешевле изменить границы агрегатов и убрать требование атомарности между сервисами.

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

  • Явно определено, где нужна атомарность, а где допустима согласованность в конечном итоге.
  • У координатора есть стратегия восстановления и долговечный журнал транзакции.
  • Политики тайм-аутов проверены на сетевых разделениях и задержках.
  • Все участники безопасно обрабатывают повторные команды COMMIT и ABORT.
  • Есть бизнес-механизм компенсации и ручного разрешения спорных случаев.

Частая ошибка: вводить двухфазную фиксацию между сервисами без оценки блокировок, модели повторов и стоимости восстановления.

Источники

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

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