В прошлом уроке мы выяснили, что 2PC может намертво заблокировать базу данных, если Координатор «умрет» между фазами. Чтобы решить эту проблему, добавили промежуточный буферный шаг. Так появился Трехфазный коммит (3PC).
Как работают 3 фазы:
- Can Commit (Голосование): Координатор спрашивает: «Сможете сделать?». Все отвечают «Да».
- PreCommit (Подготовка): Это новая фаза! Координатор рассылает «Окей, все согласны, готовьтесь к коммиту». Участники фиксируют у себя этот статус, но данные еще не меняют.
- Do Commit (Фиксация): Координатор шлет команду на финальную запись.
Как 3PC спасает от блокировок? (Консультация соседей)
Допустим, Координатор сгорел прямо перед третьей фазой (Do Commit). Участники не зависают вечно. По истечении таймаута они начинают общаться друг с другом напрямую:
Если бы ни один из участников не получил PreCommit, они бы вместе приняли решение сделать Rollback. Главное: система способна сама выйти из кризиса, не дожидаясь администратора.
- Плюсы: Устойчивость к падению Координатора (Non-blocking).
- Минусы: Огромное количество сетевых запросов (Message Overhead) и задержек (Latency). Из-за этого в реальном HighLoad-продакшене 3PC почти не используют.
Итог: 2PC блокирует систему, 3PC слишком медленный. Именно поэтому мы переходим к изучению паттерна SAGA, который решает эту проблему без долгих блокировок баз данных.