Files
digital-garden/dev/fundamental/Two-Phase Commit.md
2025-01-17 15:29:17 +03:00

65 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- 2PC
- двухфазный-коммит
- двухфазный коммит
tags:
- maturity/🌱
date: 2025-01-13
---
**Двухфазный коммит (Two-Phase Commit, 2PC)** — это протокол [[../architecture/Распределенная транзакция|распределённой транзакции]], который обеспечивает [[../architecture/Согласованность данных|согласованность данных]] между несколькими системами или узлами. Он используется для выполнения атомарных операций в распределённых системах, таких как базы данных и брокеры сообщений.
**Преимущества двухфазного коммита**
- **Гарантия согласованности**. Все участники либо фиксируют изменения, либо откатываются к исходному состоянию.
- [[Атомарная операция|Атомарность операций]]. Транзакция выполняется полностью или не выполняется вообще.
**Недостатки двухфазного коммита**
- **Производительность**.
- Протокол увеличивает задержки из-за необходимости согласования между участниками.
- Блокировка ресурсов (например, записей в базе данных) может привести к снижению пропускной способности системы.
- **Риск блокировок (Blocking)**. Если координатор выходит из строя, участники могут остаться в подвешенном состоянии, ожидая дальнейших команд.
- **Сложность реализации**. Настройка двухфазного коммита в распределённых системах требует глубокого понимания протокола и особенностей инфраструктуры.
- **Проблемы масштабирования**. Протокол плохо работает в системах с большим количеством участников из-за увеличения числа сообщений и времени согласования.
Протокол состоит из двух этапов:
- **Фаза подготовки (Prepare Phase)**:
- Координатор транзакции отправляет запрос всем участникам (например, базам данных или брокерам сообщений) с просьбой подготовиться к выполнению операции.
- Участники проверяют возможность выполнения операции и сообщают координатору о своём статусе:
- **“Готов” (Vote Yes)**, если операция может быть выполнена.
- **“Не готов” (Vote No)**, если операция невозможна. Если хотя бы один участник возвращает “Не готов”, координатор инициирует откат транзакции.
- **Фаза фиксации (Commit Phase)**:
- Если все участники подтвердили готовность, координатор отправляет команду зафиксировать изменения (**Commit**).
- Участники фиксируют изменения и подтверждают выполнение операции.
- Если хотя бы один участник не может выполнить фиксацию, координатор отправляет команду отката (**Rollback**) всем участникам.
**Двухфазный коммит применим, если:**
- Критически важно обеспечить [[../architecture/Согласованность данных|согласованность данных]].
- Количество участников в транзакции относительно небольшое.
- Высокая задержка или снижение производительности являются допустимыми.
**Применение двухфазного коммита**.
- **Банковские транзакции**. Обеспечение согласованности при переводе средств между счетами.
- **Обновление нескольких баз данных**. Когда данные в разных базах должны быть изменены синхронно.
- **Интеграция с брокерами сообщений**. Обеспечение атомарности при отправке сообщений и обновлении базы данных.
Однако, в большинстве современных распределённых систем предпочитают альтернативные подходы из-за их большей гибкости и масштабируемости.
**Альтернативы двухфазному коммиту**
- [[../architecture/Идемпотентность|Идемпотентные операции]]. Вместо сложных транзакций системы обрабатывают повторы операций без изменений состояния.
- [[../architecture/Transactional Outbox|Outbox-паттерн]]. Использование промежуточного хранилища для согласования операций.
- [[../architecture/Event Sourcing|Event Sourcing]]. Применение событийной модели, где изменения состояния записываются как события, а не как транзакции.
- [[../../../../_inbox/Basically Available Soft state Eventual consistency|BASE]] вместо [[../database/Свойства транзакций БД|ACID]]. Принятие модели [[../../../../_inbox/Basically Available Soft state Eventual consistency|BASE]], которая допускает временную рассогласованность ради повышения производительности.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2025-01-13]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->