Защищает ли двухфазная фиксация от ошибок окончательной фиксации?

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


person user782220    schedule 23.06.2012    source источник
comment
Как и когда именно вы ожидаете появления этой ошибки? Я предполагаю, что такая ошибка возникнет на первом этапе, что приведет к откату.   -  person Oded    schedule 24.06.2012
comment
Вы имеете в виду, что определение фазы предварительной фиксации состоит в том, что каждый фактически полностью выполняет свою часть транзакции, и эта фаза фиксации определяется простой записью ‹committed› в журнал, но критическим моментом является то, что фактическое выполнение транзакции не происходит во время фаза фиксации? Во всех статьях о двухфазной фиксации, с которыми я сталкивался, никогда четко не указывается, когда каждая база данных выполняет свою часть транзакции.   -  person user782220    schedule 24.06.2012
comment
Что ж, то, что на самом деле происходит, зависит от реализации. Но да, это примерно то, что происходит (изменения внесены, и единственное, чего ждут распределенные базы данных, - это подтверждение от координатора, чтобы закрыть сделку путем фиксации).   -  person Oded    schedule 24.06.2012
comment
Есть ли статья, в которой прямо говорится, что выполнение происходит на этапе предварительной фиксации?   -  person user782220    schedule 24.06.2012
comment
Когда участник сигнализирует координатору, что он готов к фиксации, он обещает, что он будет ждать, пока координатор сообщит ему о решении, и что он сможет завершить транзакцию, если решение принято (и откат, если решение принято. откат). Теперь, если координатор отправляет COMMIT, а участник вылетает при фиксации из-за ошибки, вы получаете неполную фиксацию. Я забыл, признают ли участники, что они совершили совершение; сбойный участник, который перезапускается, может повторно опросить координатора, чтобы узнать статус транзакции.   -  person Jonathan Leffler    schedule 24.06.2012


Ответы (1)


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

Двухэтапная фиксация пытается решить проблему двух генералов. Полного решения этой проблемы нет. TPC является приблизительным.

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

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

person usr    schedule 23.06.2012