Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

СТАТЬЯ
06.09.02


Транзакции SQLBase 8.0 и COM+

© Сурен Бехари, Gupta LLC.
Переведено БНТП по заказу Interface Ltd.

Обзорные сведения

В данном материале обсуждается Microsoft Transaction Server (MTS), а также вопросы реализации поддержки транзакций COM+ программой SQLBase 8.0 также известных под названием MTS). Приводятся примеры приложений COM+.

Введение

В наши дни транзакции больше не ограничены пределами базы данных. Транзакции отвечают за осуществление сложных бизнес-процессов, что подразумевает обновление баз данных, принадлежащих различным поставщикам и способных располагаться далеко друг от друга. Поддержка транзакций SQLBase COM+ позволяет полностью интегрировать SQLBase и транзакции COM+, включая полную поддержку фиксации и отката для всей транзакции в целом. Для создания транзакций COM+ могут применяться многие языки программирования, включая Team Developer . Так, например, одна составная транзакция может отвечать за перенос денежных средств со счета в местном банке (SQLBase) на центральный счет (Microsoft SQL Server). Эта транзакция может завершиться либо успехом, либо неудачей. В последнем случае откат производится во всех базах данных, участвующих в транзакции.

Поддержка Microsoft Transaction Server (MTS)

Прежде чем перейти к проблеме создания приложений MTS для SQLBase 8.0 с использованием разработанного компанией Gupta Technologies средства разработки на языке четвертого поколения 4GL, Team Developer (или любого другого языка разработки, такого как Visual C++, Visual Basic, Delphi и Power Builder), следует определить значение некоторых понятий:

Что такое MTS?

MTS сочетает в себе брокер объектных запросов (ORB), менеджер ресурсов и монитор транзакций.

MTS - это распределенная среда времени выполнения для объектов COM, обеспечивающая инфраструктуру для операций с объектами в сети. Она состоит из брокера объектных запросов (ORB), администратора ресурсов и монитора транзакций. MTS поддерживает автоматическое управление транзакциями, организацию связного пула обращений к базам данных, изоляцию процессов, автоматическое помещение потоков в пул, автоматизацию управления экземплярами объектов, совместное использование ресурсов, систему безопасности, основанную на принципе ролей, мониторинг транзакций в рамках распределенного приложения и т. д.

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

Исходя из этого, программисты могут создавать такие компоненты для размещения на сервере, которые будут действовать так, будто одновременно к серверу подключается только один клиент.

Архитектура MTS

MTS - это псевдопроцесс DLL. Компоненты сервера DLL загружаются в псевдопроцесс MTS (MTSx.exe) вместе с управляющей программой MTS (MTSxex.dll).

Team Developer можно применять для построения объекта MTS по образцу DLL. MTS создает "программы-заместители" для клиентов. Для управления экземплярами компонентов, установленных под контролем MTS, создается "родственный" исходному объект (так называемый "контекстный объект"), интерфейс которого представлен IObjectContext.

IObjectContext применяется для подтверждения или отмены связанных с объектом транзакций, их блокировки/деблокировки, а также проверки безопасности вызывающей программы компонента. Контекст содержит сведения о среде времени выполнения объекта (например, имя автора объекта и - по желанию - название транзакции, описывающей сферу действий объекта).

Объект MTS и связанный с ним контекстный объект имеют схожие жизненные циклы. MTS создает контекст перед созданием объекта MTS и удаляет его после удаления объекта MTS.

MTS координирует обмен данными между компонентами и базами данных в рамках набора заранее установленных соединений (создание связанного пула).

Клиенты MTS создают компоненты MTS с помощью COM и поручают управление их выполнением MTS. Клиентам направляется информация о последовательности событий MTS и статусе транзакции ("успешное завершение/откат").

Операцией называется набор объектов MTS, связанных единым распределенным потоком последовательного выполнения. Объект MTS может относиться только к одной операции.

COM+ (COM в сочетании с новой версией MTS в ОС Windows 2000) обладает следующими функциями:

Распределенные транзакции

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

Ниже объясняются свойства ACID, определяющие одиночные и распределенные транзакции.

Свойства ACID

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

Принцип "всё или ничего"

"Атомарность" предполагает успешное завершение транзакции лишь тогда, когда успешно/полностью проводится каждое действие в определяемой транзакцией цепочке. В противном случае транзакция считается недействительной.

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

Принцип сохранения исходного состояния данных до завершения транзакции

Термин "непротиворечивость" означает необходимость сохранения первоначального состояния данных до полного завершения транзакции.

Обратимся к выбранному примеру. Исходные значения во всех обновляемых таблицах должны быть записаны с тем, чтобы восстановить их в случае отката транзакции.

Принцип независимости от других транзакций

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

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

Принцип зависимости фиксации/отката от бесконфликтного успеха

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

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

Компоненты распределенных транзакций в SQLBase 8.0

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

Приводимая ниже диаграмма иллюстрирует связи между активными составными частями варианта среды для выполнения распределенных транзакций. В данном разделе будут определены и обсуждены следующие компоненты: координатор распределенных транзакций (DTC), SQLBrm (администратор ресурсов SQLBase), а также использование технологии OLE DB для обмена данными между SQLBrm и базой данных SQLBase.

Координатор распределенных транзакций (DTC)

Компания Microsoft включила в состав ОС Windows 2000 инструмент Distributed Transaction Coordinator (DTC), который можно найти в группе "Component Services" меню "Administrative Tools".

Назначение данного средства администрирования состоит в координации работы компонентов, участвующих в транзакции. Для каждого компьютера, вовлеченного в транзакцию, DTC выступает в роли диспетчера транзакций.

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

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

Двухфазная фиксация

Фаза 1

Диспетчер транзакций запрашивает статус каждого из вовлеченных в транзакцию компонентов (ожидаемый успех/неудача операции).
В зависимости от статуса компонента вторая фаза фиксации может развиваться по одному из двух возможных сценариев.

Фаза 2 (сценарий 1)

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

Фаза 2
(сценарий 2)

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

SQLBrm - администратор ресурсов SQLBase

Роль компонента SQLBrm ясна из его названия. SQLBrm отвечает за управление таким ресурсом как база данных Gupta SQLBase. Администратор ресурсов обеспечивает операции с восстанавливаемым ресурсом, который должен иметь возможность работать подобно транзакции и обладать всеми вышеописанными свойствами ACID.

SQLBrm администрирует коммуникационные потоки, создавая их или переводя в режим "сна"/"бодрствования" (это относится к ранее созданным, но не используемым в данный момент потокам). Этот поток может использоваться для подключения к сеансу серверного или клиентского коммуникационного потока.

SQLBrm также направляет БД команду фиксации/отмены транзакции. DTC узнает статусы компонентов, и если в результате приходит сообщение об успехе/неудаче (см. выше), DTC координирует свои действия с SQLBrm, который фактически выполняет процедуры фиксации/отмены по отношению к базе данных SQLBase.

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

При отключении SQLBase SQLBrm управляет остановкой коммуникационных потоков, отключая приемник информации ("Listener"), приостанавливая имеющиеся активные потоки и завершая все сеансы.

Порядок выполнения распределенной транзакции

Обычно с SQLBase через SQLBrm связывается либо SQLBase OLE DB Provider, либо драйвер ODBC.

Контакт со стороны OLE DB Provider или драйвера ODBC приводит к тому, что программа Listener создает сеанс связи и направляет администратору ресурсов запрос на подключение потоков от клиента и сервера к данному сеансу. Если существуют незанятые потоки, то администратор использует их. В противном случае для клиента и сервера создаются новые коммуникационные потоки.

Клиенту направляется уведомление о принятии запроса, после чего тот посылает запрос на подключение. Этот запрос направляется через поток клиента в поток сервера и затем поступает в SQLBase. Ответ на запрос проделывает тот же путь в обратном направлении.

Если клиент использует транзакцию MTS, SQLBrm получит инструкцию на включение этой транзакции. После этого SQLBrm устанавливает статус сеанса "активен".

Любая операция с базой данных выполняется в той же последовательности, что и запрос на подключение.

Когда клиент фиксирует транзакцию MTS, DTC сначала сообщает всем задействованным администраторам ресурсов о необходимости подготовки к фиксации, а затем осуществляет фиксацию. SQLBrm устанавливает метку фиксации сеанса и удаляет данные из журнала. При разрыве соединения с клиентом в SQLBase направляется соответствующее сообщение, и клиентский поток отключается от сеанса.

После принятия SQLBase сообщения о прекращении соединения выполняется отключение серверного потока и удаление сеанса.

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

В этом состоит отличие от обычного для SQLBase определения транзакции как события, происходящего в период от подключения до отключения.

Резюме

В представленных выше разделах мы дали представление о распределенной транзакции и компонентах, необходимых для ее выполнения с помощью Gupta SQLBase и SQLBrm. Кроме того, мы объяснили процесс записи информации, которая требуется SQLBrm и DTC для восстановления исходных данных на случай сбоя системы.

Давайте теперь рассмотрим практическую сторону настройки среды и приведем пример использования языка Team Developer для создания приложений MTS в SQLBase 8.0

Установка приложения MTS Sample Bank

Приложение Sample Bank реализует сервисы, создающие инфраструктуру для поддержки выполнения программы в изолированной БД, создающие новые счета и удаляющие старые, открывающие и закрывающие счета, позволяет класть и снимать со счета денежные суммы, а также просматривать баланс.

Это приложение позволяет проверить взаимодействие установленной программы MTS с Gupta SQLBase 8.0, а также обрести навыки распределения пакетов и администрирования.

Компоненты программы Sample Bank написаны на языке Team Developer (исходный код прилагается).

Создание компонентов (Team Developer)

Компоненты COM+ можно создавать с помощью Team Developer. Для этого следует открыть MTS_TD_COM_with_OLEDB.app с помощью программы Team Developer 2.1.

Выберите строку меню "Build Settings" и перейдите к закладке "Build Target". Затем назначьте имя MTS_TD.dll для DLL. Наконец, нажмите зависимую кнопку "MTS COM Server (DLL)", на закладке "COM Server" выберите опцию "Single Threaded Apartment" и убедитесь в том, что значение основной версии равно 1, а второстепенной - 0. Создайте COM.

Создание клиентской программы (Team Developer)

Пример клиентской программы, применяющей указанные выше компоненты, написан на языке Team Developer. Программа называется "MTS_TD_Client_with_OLEDB.app". Перейдя к строке меню "ActiveX Explorer", выберите COM под названием "MTS_TD 1.0 Type Library" и сгенерируйте APL для всех классов CoClasses и интерфейсов. Выполните компиляцию и сохраните APP. Создайте выполняемую программу "MTS_TD_Client_with_OLEDB.exe".

Создание консоли MMC

Нажмите кнопку "Start", выберите строку "Run" и введите "MMC". Воспользуйтесь командой "Add/Remove Snap-In". Щелкните кнопку с надписью "Add". Выберите 3 интегрируемых приложения (Snap-In): Component Services, Services и SQLBase Services. Щелкните кнопку "Close", затем - кнопку "OK" и сохраните файл под именем MTS_TD.

Установка COM+

Порядок добавления пакетных компонентов и транзакций в программу Sample Bank:

  1. В MMC воспользуйтесь путем по меню "Component Services\Computer\My Computer\Com+ Applications".
  2. Щелкните правой кнопкой мыши, а затем выберите "Add -> New Application".
  3. На первой странице мастера установки приложения СОМ щелкните кнопку "Next".
  4. Нажмите кнопку "Create an empty Application". В качестве имени приложения введите "TD Bank Demo". Задайте в качестве типа приложения "Server application". Щелкните кнопку "Next".
  5. Выберите опцию "Interactive user" на странице "Set Application Identity". Нажмите кнопку "Finish".
  6. Теперь откройте "Bank Demo". В этом узле находятся компоненты и роли.
  7. Щелкните "Components". Затем щелкните "Components" правой кнопкой мыши. Выберите последовательность команд "New -> Component". В окне мастера "COM Component Install Wizard" щелкните кнопку "Next". Выберите команду "Install new component".
  8. Укажите полный путь к DLL (созданный ранее для компонента "MTS_TD.DLL". Нажмите кнопку "Next".

Выполнение клиентской программы Bank

  1. Запустите координатор распределенных транзакций Microsoft Distributed Transaction Coordinator (MS DTC).
  2. Запустите SQLBase и SQLBrm.
  3. Запустите исполняемый файл "MTS_TD_Client_with_OLEDB.exe".
  4. Если в базе данных ISLAND присутствует таблица "Account", нажмите кнопку "Remove Infrastructure".
  5. Щелкните кнопку "Create Infrastructure". Это приведет к созданию таблицы "Account" и открытию в ней двух фиктивных счетов.
  6. Нажмите кнопку "New Account". При этом будет создан счет, номер которого будет выведен в соответствующем поле.
  7. Нажмите кнопку "Open Account". При этом на экране отобразится баланс на счету. Эта же кнопка служит для активации/дезактивации относящихся к счету кнопок.
  8. Введите значения в поля "Deposit" и "Withdrawal".
  9. Щелкните кнопку "Deposit". После этого на экран будет выведено сообщение о внесении суммы на счет, и изменится значение баланса.
  10. Нажмите кнопку "Withdrawal". После этого на экран будет выведено сообщение о снятии суммы со счета, и изменится значение баланса. Примечание: при попытке снять со счета сумму, превышающую остаток, на экран будет выведено сообщение о невозможности выполнения подобной операции.
  11. По окончании работы со счетом щелкните кнопку "Close Account".
  12. Обратите внимание на окна DTC. Вы заметите обновление окон использования компонентов и статистических сведений о транзакциях.
  13. Поэкспериментируйте с клиентом банка и понаблюдайте за изменением этих сведений при выполнении различных типов транзакций, а также использовании различных серверов и итераций. Выполнение первой транзакции занимает больше времени, нежели последующих, поскольку:

a) в ходе выполнения первой транзакции создаются таблицы базы данных фиктивного банка с временными записями;
б) запуск процесса обращения к серверу требует привлечения системных ресурсов;
в) подключение к базе данных также является ресурсоемкой операцией.

Чтобы установить атрибуты транзакции для компонентов, выполните следующие действия:

  1. В COM "MTS_TD.MTS_QueryBalance" выберите для транзакции опцию "Supported";
  2. В COM "MTS_TD.MTS_TableDataOperations" задайте тип транзакции ("Required");
  3. В СОМ "MTS_TD.MTS_TableOperations" задайте тип транзакции ("Requires New");
  4. В СОМ "MTS_TD.MTS_UpdateBalance" задайте тип транзакции ("Required").

Скачать исходный код

Требования к ПО

Дополнительная информация

 

За дополнительной информацией обращайтесь в компанию Interface Ltd.

Обсудить на форуме Gupta Technologies

Рекомендовать страницу

INTERFACE Ltd.
Телефон/Факс: +7 (495) 925-0049
Отправить E-Mail
http://www.interface.ru
Rambler's Top100
Ваши замечания и предложения отправляйте редактору
По техническим вопросам обращайтесь к вебмастеру
Дата публикации: 06.09.02