65 lines
6.9 KiB
Markdown
65 lines
6.9 KiB
Markdown
---
|
||
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) -->
|
||
|