Контекст
Консистентность и идемпотентность
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-стоимости.
Связанные главы
Паттерны консистентности и идемпотентность
Идемпотентность обязательна для безопасной обработки retries и recovery.
Event-Driven Architecture
Saga и асинхронная координация как практичная альтернатива distributed XA.
Паттерны отказоустойчивости
Timeout/retry/bulkhead стратегии определяют поведение транзакции при сбоях.
Leader Election: паттерны и реализации
Coordinator-pattern часто опирается на лидерскую координацию.
Testing Distributed Systems
Проверяйте partial commit/timeout/recovery сценарии до production.
