Что такое протокол двухфазной фиксации (2PC)?

Ответ

Двухфазная фиксация (Two-Phase Commit, 2PC) — это протокол для обеспечения атомарности распределённых транзакций. Его главная задача — гарантировать, что транзакция либо успешно завершится на всех узлах системы (commit), либо будет отменена на всех узлах (rollback).

Протокол состоит из двух фаз и управляется Координатором, который взаимодействует с Участниками транзакции.

Фаза 1: Подготовка (Prepare Phase)

  1. Координатор отправляет всем участникам запрос prepare.
  2. Каждый участник проверяет, может ли он выполнить свою часть транзакции. Он записывает необходимые данные в лог для восстановления и блокирует ресурсы.
  3. Если участник готов, он отвечает VOTE_COMMIT. Если нет — VOTE_ABORT.

Фаза 2: Фиксация (Commit Phase)

  1. Координатор собирает ответы:
    • Если все участники ответили VOTE_COMMIT, координатор отправляет всем команду GLOBAL_COMMIT.
    • Если хотя бы один участник ответил VOTE_ABORT (или не ответил в течение таймаута), координатор отправляет всем команду GLOBAL_ABORT.
  2. Участники, получив команду, завершают транзакцию (применяют или откатывают изменения) и освобождают ресурсы.

Ключевые проблемы 2PC:

  • Блокировка: Если координатор выходит из строя после фазы подготовки, участники остаются заблокированными и не знают, какое решение принять. Они вынуждены ждать восстановления координатора.
  • Производительность: Протокол является синхронным и требует нескольких раундов сетевого взаимодействия, что замедляет работу системы.
  • Неустойчивость к отказам сети: Частичные сбои сети могут привести к несогласованному состоянию.

Из-за этих недостатков в современных системах часто предпочитают альтернативные подходы, такие как паттерн Saga или протокол Paxos/Raft.