Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00

Лекция 25: Службы компонентов и Microsoft Distributed Transaction Coordinator

Примеры использования MS DTC

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

Банковские транзакции

Предположим, вы разрабатываете способ выполнения транзакций компьютерными системами в двух банках для перевода (трансферта) денег между этими банками. Когда клиент запрашивает электронный перевод денег, этими системами должны быть выполнены две основные транзакции: нужно снять деньги со счета 1 в банке A и добавить их на счет 2 в банке B.


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


Эти две транзакции выполняются банковским терминалом, инициирующим программу, которая запускает последовательность SQL-операторов в третьей (клиентской) компьютерной системе. Эти SQL-операторы выполняют следующие операции:

  1. Обновляют счет 1 в системе A, снимая с него n долларов.
  2. Фиксируют транзакцию.
  3. Обновляют счет 2 в системе B, добавляя к нему n долларов.
  4. Фиксируют транзакцию.

Этот метод действует, пока в любой из систем нет никаких проблем, но это отнюдь не самый надежный способ перевода денег. Что произойдет при сбое в одной из систем во время этих операций? Возможны следующие результаты:

  • Не будет выполнена первая транзакция из-за ошибки в системе A или в клиентской системе. Тем самым не будет выполнена вторая транзакция и поэтому никаких денег не будет переведено.
  • Первая транзакция выполнится успешно, но не будет выполнена вторая транзакция из-за ошибки в системе B или в клиентской системе. Деньги будут потеряны.

Второй результат явно неприемлем. Вот более подходящий способ выполнения этой транзакции:

  1. Обновление счета 1 в системе A; с него снимается n долларов.
  2. Обновление счета 2 в системе B; к нему добавляется n долларов.
  3. Фиксирование обеих транзакций в одном наборе. Фиксируются либо обе транзакции, либо ни одна из них.

MS DTC позволяет вам выполнять эти операции. Используя службу MS DTC, вы можете указывать, какие распределенные транзакции фиксируются как один набор. Либо фиксируются все эти транзакции, либо для всех них выполняется откат.