Защищает ли двухфазная фиксация от ошибок окончательной фиксации?
Предположим, что все базы данных, участвующие в распределенной транзакции, реализованы с сигналом двухфазной фиксации, что они готовы к фиксации и имеют необходимые блокировки. Координатор подает сигнал на фиксацию, и все базы данных выполняют свою часть транзакции, но одна база данных SQL обнаруживает ошибку деления на ноль в результате недосмотра программы, который не учитывает эту возможность. Поскольку координатор уже дал понять, что передают все, что происходит в результате этого деления на ноль?
1 ответ
Вторая фаза фиксации обычно не содержит пользовательский код, который может дать сбой. Участвующие менеджеры ресурсов должны гарантировать, что сбой не произойдет. В случае нарушения этой гарантии протокол не может предоставить никаких гарантий.
Двухфазный коммит пытается решить проблему двух генералов. Нет полного решения этой проблемы. TPC является приблизительным.
Другой способ TPC может потерпеть неудачу в случае сетевого раздела. Некоторые менеджеры ресурсов могут выполнить окончательную фиксацию, но некоторые могут не получить это сообщение. Опять же, эта проблема неразрешима. Даже повторные попытки не могут решить это.
Вы даже можете вызвать эту проблему в реальных условиях: запустите все участвующие узлы в стресс-тесте и протяните сетевой кабель в произвольной точке. С большой вероятностью ваши распределенные базы данных теперь несовместимы, потому что некоторые сообщения о фиксации теряются в очень неудобное время.