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

Сурен Бехари, Gupta LLC.

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

В данном материале обсуждается 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), следует определить значение некоторых понятий:

  • Microsoft Transaction Server
    • Архитектура MTS
  • Распределенные транзакции
    • Свойства ACID
  • Компоненты распределенных приложений в SQLBase 8.0
    • DTC
    • Двухфазная фиксация транзакции
    • SQLBrm
    • Коммуникационные потоки
    • Возврат
    • Ведение журнала
  • Реализация распределенной транзакции

Что такое 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) обладает следующими функциями:

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

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

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

Ниже объясняются свойства 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").

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

  • SQLBase 8.0
  • SQLWindows 2.1

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=3796