Ответ
Двухфазная фиксация (Two-Phase Commit, 2PC) — это протокол для обеспечения атомарности распределённых транзакций. Его главная задача — гарантировать, что транзакция либо успешно завершится на всех узлах системы (commit), либо будет отменена на всех узлах (rollback).
Протокол состоит из двух фаз и управляется Координатором, который взаимодействует с Участниками транзакции.
Фаза 1: Подготовка (Prepare Phase)
- Координатор отправляет всем участникам запрос
prepare
. - Каждый участник проверяет, может ли он выполнить свою часть транзакции. Он записывает необходимые данные в лог для восстановления и блокирует ресурсы.
- Если участник готов, он отвечает
VOTE_COMMIT
. Если нет —VOTE_ABORT
.
Фаза 2: Фиксация (Commit Phase)
- Координатор собирает ответы:
- Если все участники ответили
VOTE_COMMIT
, координатор отправляет всем командуGLOBAL_COMMIT
. - Если хотя бы один участник ответил
VOTE_ABORT
(или не ответил в течение таймаута), координатор отправляет всем командуGLOBAL_ABORT
.
- Если все участники ответили
- Участники, получив команду, завершают транзакцию (применяют или откатывают изменения) и освобождают ресурсы.
Ключевые проблемы 2PC:
- Блокировка: Если координатор выходит из строя после фазы подготовки, участники остаются заблокированными и не знают, какое решение принять. Они вынуждены ждать восстановления координатора.
- Производительность: Протокол является синхронным и требует нескольких раундов сетевого взаимодействия, что замедляет работу системы.
- Неустойчивость к отказам сети: Частичные сбои сети могут привести к несогласованному состоянию.
Из-за этих недостатков в современных системах часто предпочитают альтернативные подходы, такие как паттерн Saga или протокол Paxos/Raft.