System Design Space

    Глава 88

    Обновлено: 15 февраля 2026 г. в 18:05

    Distributed Transactions: 2PC и 3PC

    Прогресс части0/21

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

    Контекст

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

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

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

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

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

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

    2PC flow

    2PC: two-phase commit

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

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

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

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

    Риски

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

    Protocol Steps

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

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

    Coordinator

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

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

    Participants

    3 участника

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

    Order

    participant A

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

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

    Payment

    participant B

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

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

    Inventory

    participant C

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

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

    3PC flow

    3PC: three-phase commit

    CanCommit -> PreCommit -> DoCommit

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

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

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

    Риски

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

    Protocol Steps

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

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

    Coordinator

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

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

    Participants

    3 участника

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

    Order

    participant A

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

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

    Payment

    participant B

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

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

    Inventory

    participant 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