Как работают распределенные транзакции (например, MSDTC)? - PullRequest
13 голосов
/ 11 сентября 2008

Я нечетко понимаю, как работают обычные 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%, кажется, что между шагами есть много места для ошибки.

1 Ответ

4 голосов
/ 11 сентября 2008

О «шаге 4»:

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

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

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

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

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

...