Почему двухфазная фиксация считается атомарной?

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

Рассмотрим случай с двумя базами данных, A и B. Если есть раздел во время фазы фиксации после фиксации A, но до того, как B зафиксировал фиксацию, транзакция будет частично зафиксирована. Пользователь, запрашивающий A и B, не увидит согласованных данных - транзакция зафиксирована на A, но у B есть данные, полученные до фиксации.

«Согласованная» часть ACID, похоже, также нарушена - клиент, запрашивающий A и B, может видеть данные, которые нарушают бизнес-правила.

Я предполагаю, что идея состоит в том, что система в конечном итоге сможет оправиться от этого, когда раздел будет закончен и менеджер транзакций проинструктирует B о фиксации. Тем временем, система находится в противоречивом состоянии «частично зафиксировано». Разве весь смысл атомарности не в том, чтобы предотвратить это? К тому времени, когда последовательность будет восстановлена, ущерб уже может быть нанесен.

Какое свойство упоминается, когда двухфазная фиксация называется атомарной?


person Gavin Wahl    schedule 25.02.2016    source источник
comment
Возможный дубликат Каким ACID является протокол двухфазной фиксации?   -  person Thilo    schedule 25.02.2016
comment
Думаю, это вопрос уровня изоляции. Ниже «Повторяемое чтение» вы можете увидеть некоторые данные в том виде, в котором они были до фиксации транзакции, и некоторые данные в том виде, в котором они были после фиксации транзакции. Пока нет грязных чтений, это все еще считается ACID (и это может случиться даже с нераспределенной базой данных). Уровень изоляции Сериализуемый обычно не требуется.   -  person Thilo    schedule 25.02.2016
comment
Ответ на другой вопрос гласит, что 2PC действительно только обещает, что операция является атомарной. Мой вопрос в том, почему он считается атомарным, если он не кажется атомарным. Какую атомарность обеспечивает 2pc?   -  person Gavin Wahl    schedule 25.02.2016
comment
В ответе также говорится, что 2PC не устойчив ко всем сценариям сбоя и нарушает работу каждой из четырех ACID. Например, если вы выключите B посередине, он, возможно, еще не зафиксирован (в то время как A есть), и будет откат во время восстановления, так что вы получите несогласованное состояние. Но если не считать этого, это атомарно: будет совершена вся транзакция или ничего не будет. Как результаты видны другим транзакциям - это вопрос изоляции.   -  person Thilo    schedule 25.02.2016


Ответы (2)


Атомарный означает, что либо операция будет иметь какой-то эффект, либо система останется в том же состоянии. Алгоритм 2PC работает таким образом, что сначала координатор запрашивает у всех распределенных машин prepare для транзакции. После получения Yes он отправляет команду на фиксацию транзакции.

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

Согласованности можно добиться только с помощью уровня изоляции. Разрешить чтение или нет и разрешить грязное чтение или нет.

person Basit Anwer    schedule 25.02.2016

У меня нет академического образования в этом, но из моего практического опыта (я QE для проекта Narayana) 2PC не обозначен как ACID. Это только гарантирует, что транзакция будет атомарной. Атомарный, где закончено все или ничего.

Я думаю, вы довольно хорошо ответили на вопрос об ограничении 2PC.

Поскольку транзакция распределяется между несколькими БД / брокерами JMS / ... нет гарантии, что они будут изолированы друг от друга. Как указано, диспетчер транзакций управляет только ресурсами и сообщает, когда подготовить (заблокировать), а когда зафиксировать. Например, если соединение между диспетчером транзакций и вторым ресурсом прерывается во время фазы фиксации, когда первый ресурс уже зафиксирован, тогда да, вы можете видеть уже зафиксированные данные на первом ресурсе, но второй ожидает, что фиксация будет обработана после установки соединения. Но вы уверены, что в конце оно будет совершено. Изоляция обеспечивается (может быть) на уровне конкретного ресурса (все транзакции, работающие с данными на втором ресурсе, будут изолированы).

С другой стороны, я считаю, что последовательность не нарушена. Согласованность означает, что транзакция переводит систему из одного допустимого состояния в другое в соответствии с определенными правилами. Система будет согласованной в начале транзакции и в конце транзакции.

Как указано в ACID (https://en.wikipedia.org/wiki/ACID), то обычно даже транзакция БД ослабляет изоляцию свойства ACID по умолчанию. Большинство БД используют уровень изоляции по умолчанию READ COMMITTED, который защищает вас от всех проблем (могут произойти неповторяющиеся чтения и фантомные чтения, когда это зависит от реализации БД).

person chalda    schedule 07.03.2016
comment
Я случайно вернулся к этому вопросу. Я хотел бы усилить свой ответ здесь. Проблема в том, что вопрос смешивает понятие последовательности ACID и последовательности CAP. Атомарность определяет, что транзакция полностью или полностью прервана. Больше ничего о частичных результатах во время выполнения транзакции. Последовательность говорит о том, что после завершения транзакции база данных структурно исправна. Обращаю внимание на доработку. Неоднозначность состоит в том, что согласованность CAP гласит: все операции чтения и записи, наблюдаемые всеми узлами, являются атомарными. - person chalda; 03.08.2017