Идиомы или алгоритмы для распределенных транзакций? - PullRequest
2 голосов
/ 22 марта 2011

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

Простой пример, который, по сути, должен запускать 2 строки на 2 отдельных устройствах:

my_bank.my_account -= payment
their_bank.their_account += payment

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

1 Ответ

5 голосов
/ 22 марта 2011

Существует также 3PC " 3 Phase Commit Protocol ".3PC решает некоторые проблемы 2PC, имея дополнительную фазу, называемую pre-commit.Участник транзакции получает сообщение о предварительной фиксации, чтобы узнать, что все остальные участники согласились зафиксировать, но еще не сделали этого.Эта фаза устраняет неопределенность 2PC, когда все участники ждут сообщения о фиксации или прерывании от координатора.

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

Большая часть этого материала очень хорошо обсуждается в

"Database Solutions, второе издание"

и

" Системы баз данных: полная книга "

Еще в распределенном мире вы можете захотеть проверить текущее состояниеТехнология веб-сервиса для распределенных транзакций и рабочих процессов .Не моя чашка чая, если честно.Существуют платформы для Python, Java и .Net для запуска такого рода сервисов ( пример ).

Как и мой прошлогодний проект, несколько лет назад я реализовал распределенный протокол 2PC наtop of Web Services, и я смог запустить транзакции в двух отдельных базах данных, как в примере, который вы привели.Тем не менее, я уверен, что сегодня люди реализуют это в наиболее спокойной манере, например, см. Здесь .Несмотря на то, что в этих ссылках упоминаются некоторые другие протоколы, в конце концов все они реализуют 2PC.

В итоге, реализация протокола 2PC с соответствующими журналами операций для отмены / восстановления в случае сбоя - однаиз наиболее разумных вариантов для.

...