Подтвердить что ты не робот

Как работают распределенные транзакции (например, MSDTC)?

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

Как работают распределенные транзакции? В некоторых документах MS я прочитал, что вы можете каким-то образом выполнить транзакцию между базами данных и файловыми системами (между прочим).

Эта технология может быть (и, вероятно, используется) для установщиков, где вы хотите, чтобы программа была полностью установлена ​​или полностью отсутствовала. Вы просто начинаете транзакцию в начале установки. Затем вы можете подключиться к реестру и файловой системе, внося изменения, которые определяют установку. Когда задание выполняется, просто зафиксируйте или откат, если по какой-либо причине установка завершилась неудачей. Реестр и файловая система автоматически очищаются для вас этим магическим распределенным координатором транзакций.

Как возможно, что две несопоставимые системы могут быть реализованы таким образом? Мне кажется, что всегда можно оставить систему в несогласованном состоянии, когда файловая система внесла свои изменения, а в реестре нет. Я думаю, что в MSDTC даже возможно выполнить транзакцию по сети.

Я прочитал http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx, но он чувствует себя только как начало объяснения, и что шаг 4 должен быть значительно расширен.

Изменить: Из того, что я собираю на http://en.wikipedia.org/wiki/Distributed_transaction, это может быть выполнено с помощью двухфазного фиксации (http://en.wikipedia.org/wiki/Two-phase_commit). Прочитав это, я до сих пор не понимаю метод 100%, кажется, что есть много места для ошибок между шагами.

4b9b3361

Ответ 1

О "шаге 4":

Координатор транзакций с менеджерами ресурсов для обеспечения что все работа или ни одна работа, если это сделано, таким образом поддерживая свойства ACID.

Это, конечно, требует от всех участников предоставления правильных интерфейсов и (безошибочных) реализаций. Интерфейс выглядит смутно:

public interface ITransactionParticipant {
    bool WouldCommitWork();
    void Commit();
    void Rollback();
}

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

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