Введение

В обработке транзакций, базах данных и компьютерных сетях протокол двухфазного коммита (2PC, tupac) является типом протокола атомного коммита (ACP). Это распределенный алгоритм, координирующий все процессы, участвующие в распределенной атомарной транзакции, для принятия решения о коммите (подтверждении) или аборте (откате) транзакции. Этот протокол (специализированный тип протокола консенсуса) достигает своей цели даже во многих случаях временных сбоев системы (включая сбои процессов, сетевых узлов, коммуникаций и т.д.). Однако он не устойчив ко всем возможным конфигурациям сбоев, и в редких случаях требуется ручное вмешательство для исправления ситуации. Для восстановления после сбоя (в большинстве случаев автоматического) участники протокола используют журналирование состояний протокола. Журнальные записи, которые обычно создаются медленно, но сохраняются при сбоях, используются процедурами восстановления протокола. Существует множество вариантов протокола, которые в основном различаются стратегиями журналирования и механизмами восстановления. Хотя процедуры восстановления обычно предназначены для редкого использования, они составляют значительную часть протокола из-за множества возможных сценариев сбоев, которые необходимо учитывать и поддерживать. В "нормальном выполнении" любой отдельной распределенной транзакции (то есть, когда сбои не происходят, что обычно является наиболее частой ситуацией), протокол состоит из двух фаз:
Фаза запроса коммита (или фаза голосования), на которой процесс координатора пытается подготовить все участвующие процессы транзакции (называемые участниками, когортами или воркерами) к выполнению необходимых действий для коммита или отката транзакции и проголосовать: "Да" – коммит (если выполнение локальной части участника транзакции завершилось успешно), или "Нет" – откат (если обнаружена проблема с локальной частью); и
Фаза коммита, на которой, основываясь на голосовании участников, координатор решает, следует ли выполнить коммит (только если все проголосовали "Да") или откат транзакции (в противном случае), и уведомляет участников о результате. Затем участники выполняют необходимые действия (коммит или откат) со своими локальными транзакционными ресурсами (также называемыми восстанавливаемыми ресурсами, например, данными базы данных) и соответствующими частями в других результатах транзакции (если применимо). Протокол двухфазного коммита (2PC) не следует путать с протоколом двухфазной блокировки (2PL), протоколом управления параллелизмом.

Фаза запроса на обязательство (или голосования)

Координатор отправляет запрос на подтверждение транзакции всем участникам и ждет ответа от каждого из них. Участники выполняют транзакцию до точки, где им будет предложено зафиксировать изменения. Каждый из них записывает информацию в журнал отката и журнал повтора. Каждый участник отвечает сообщением о согласии (участник голосует "за" фиксацию), если его действия выполнены успешно, или сообщением об откате (участник голосует "против" фиксации), если участник столкнулся со сбоем, который делает фиксацию невозможной.

Недостатки

Самый большой недостаток протокола двухфазной фиксации заключается в том, что это блокирующий протокол. Если координатор выходит из строя без возможности восстановления, некоторые участники никогда не завершат свои транзакции: после того, как участник отправил сообщение о согласии в ответ на запрос на фиксацию от координатора, он будет заблокирован до получения команды фиксации или отката. Протокол двухфазной фиксации не может надежно восстановиться после сбоя как координатора, так и участника группы во время фазы фиксации. Если вышел из строя только координатор и ни один участник группы не получил сообщение о фиксации, можно с уверенностью предположить, что фиксация не произошла. Однако, если координатор и участник группы вышли из строя одновременно, возможно, что вышедший из строя участник группы был первым, кто был уведомлен, и фактически выполнил фиксацию. Даже если будет выбран новый координатор, он не сможет уверенно продолжить операцию, пока не получит подтверждение от всех участников группы, и поэтому должен ждать ответа от всех участников.

Общая архитектура

Во многих случаях протокол 2PC распределяется в компьютерной сети. Он легко реализуется путем развертывания нескольких специализированных компонентов 2PC, аналогичных друг другу, обычно называемых менеджерами транзакций (TM; также именуемыми агентами 2PC или мониторами обработки транзакций), которые выполняют протокол для каждой транзакции (например, X/Open XA от The Open Group). Базы данных, участвующие в распределенной транзакции – участники, включая координатора и участников – регистрируются в соответствующих TM (обычно расположенных на тех же сетевых узлах, что и участники) для завершения транзакции с использованием 2PC. Каждая распределенная транзакция имеет свой набор TM, в которые регистрируются участники транзакции. Для каждой транзакции существует лидер – координатор TM, который координирует 2PC, как правило, TM базы данных-координатора. Однако роль координатора может быть передана другому TM для повышения производительности или надежности. Участники обмениваются сообщениями не друг с другом, а со своими TM. Соответствующие TM взаимодействуют между собой для выполнения схемы протокола 2PC, "представляя" соответствующих участников и завершая транзакцию. Такая архитектура обеспечивает полную распределенность протокола (отсутствие централизованного компонента обработки или структуры данных) и эффективное масштабирование с ростом числа сетевых узлов (размера сети). Эта распространенная архитектура также эффективна для распределения других протоколов атомарной фиксации, помимо 2PC, поскольку все они используют один и тот же механизм голосования и распространения результатов участникам протокола. Предположение об исходе транзакции – фиксация или откат – может сократить количество передаваемых сообщений и операций записи в журнал, выполняемых участниками в процессе работы протокола 2PC. Например, при предполагаемом откате, если в ходе восстановления системы после сбоя процедура восстановления не обнаружит в журнале подтверждений фиксации какой-либо транзакции, она предполагает, что транзакция была отменена, и действует соответствующим образом. Это означает, что запись отката не обязательна, и ее можно избежать при таком предположении. Обычно восстановление после сбоя требует дополнительных операций, стоимость которых зависит от типа оптимизации. Таким образом, оптимальный вариант оптимизации, если он существует, выбирается на основе статистики сбоев и исходов транзакций.

Двухфазный протокол коммитации дерева

Протокол Tree 2PC является вариантом протокола Tree 2PC без предопределенного координатора. Он объединяет несколько ранее предложенных оптимизаций. Сообщения о достижении согласия (подтверждающие голоса) начинают распространяться от всех листьев дерева, каждый лист – после завершения своих задач в рамках транзакции (когда он становится готовым). Промежуточный (не листовой) узел отправляет сигнал готовности, когда получает сообщение о согласии от последнего (единственного) соседнего узла, от которого оно еще не поступило. Координатор определяется динамически в процессе "гонки" сообщений о согласии по дереву транзакций, в точке их столкновения. Столкновение может произойти либо в узле дерева транзакций, который становится координатором, либо на ребре дерева. В последнем случае один из двух узлов, соединенных этим ребром, избирается координатором (любой из узлов). D2PC является оптимальным по времени (для всех экземпляров конкретного дерева транзакций и любой реализации протокола Tree 2PC; все экземпляры используют одно и то же дерево; каждый экземпляр имеет различный узел в качестве координатора): выбирая оптимального координатора, D2PC обеспечивает фиксацию транзакции как для координатора, так и для каждого участника за минимально возможное время, что позволяет максимально быстро освободить заблокированные ресурсы у каждого участника транзакции (узла дерева).