СТАТЬЯ |
06.09.02
|
© Сурен
Бехари, 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). Эта транзакция может завершиться либо успехом, либо неудачей. В последнем случае откат производится во всех базах данных, участвующих в транзакции.
Прежде чем перейти к проблеме создания приложений MTS для SQLBase 8.0 с использованием разработанного компанией Gupta Technologies средства разработки на языке четвертого поколения 4GL, Team Developer (или любого другого языка разработки, такого как Visual C++, Visual Basic, Delphi и Power Builder), следует определить значение некоторых понятий:
MTS сочетает в себе брокер объектных запросов (ORB), менеджер ресурсов и монитор транзакций.
MTS - это распределенная среда времени выполнения для объектов COM, обеспечивающая инфраструктуру для операций с объектами в сети. Она состоит из брокера объектных запросов (ORB), администратора ресурсов и монитора транзакций. 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 - это акроним, который служит для описания 4 определяющих транзакцию свойств ("атомарная", "непротиворечивая", "изолированная" и "устойчивая"). Дадим определение каждому из них. Для этого возьмем ситуацию, когда для обновления сведений о клиенте требуется обновить данные в трех таблицах ("имя клиента", "адрес клиента" и "контактная информация").
"Атомарность" предполагает успешное завершение транзакции лишь тогда, когда успешно/полностью проводится каждое действие в определяемой транзакцией цепочке. В противном случае транзакция считается недействительной.
Обратимся к нашему примеру. Если в адресной таблице информацию не удается обновить, в то время как в остальных таблицах эта процедура проходит успешно, то это приведет к откату транзакции. Таким образом, фиксация транзакции может иметь место лишь в случае успешного обновления данных во всех 3 таблицах.
Термин "непротиворечивость" означает необходимость сохранения первоначального состояния данных до полного завершения транзакции.
Обратимся к выбранному примеру. Исходные значения во всех обновляемых таблицах должны быть записаны с тем, чтобы восстановить их в случае отката транзакции.
Термин "изолированность" означает, что каждая транзакция должна выполняться так, будто это единственная выполняемая транзакция, которая не зависит от других.
Предположим, что обновление всех 3 таблиц прошло успешно, и никто другой не пытался обновить их. В таком случае она не должна влиять или испытывать влияние со стороны какой-либо иной транзакции.
Что означает термин "устойчивость"? Это значит, что если все события успешно завершены, то транзакция обязательно подлежит фиксации, но если хотя бы одно действие потерпело неудачу, то транзакция обязательно подлежит откату.
Вернемся к нашему примеру. Если удалось обновить все строки таблицы, то для сохранения изменений в базе данных транзакция фиксируется. С другой стороны, если в процессе одного из обновлений произошла ошибка, для всей транзакции выполняется процедура отката, и значения показателей в строках таблиц остаются прежними.
Как мы уже упоминали ранее, для фиксации распределенной транзакции все событийные цепочки, входящие в состав транзакции, должны быть успешно завершены.
Приводимая ниже диаграмма иллюстрирует связи между активными составными частями варианта среды для выполнения распределенных транзакций. В данном разделе будут определены и обсуждены следующие компоненты: координатор распределенных транзакций (DTC), SQLBrm (администратор ресурсов SQLBase), а также использование технологии OLE DB для обмена данными между SQLBrm и базой данных SQLBase.
Компания Microsoft включила в состав ОС Windows 2000 инструмент Distributed Transaction Coordinator (DTC), который можно найти в группе "Component Services" меню "Administrative Tools".
Назначение данного средства администрирования состоит в координации работы компонентов, участвующих в транзакции. Для каждого компьютера, вовлеченного в транзакцию, DTC выступает в роли диспетчера транзакций.
Основной задачей такого диспетчера является регистрация событий и компонентов, принимающих участие в транзакции, а также обеспечение транзакции уникальным идентификатором, который может применяться для обозначения компонентов транзакции. Кроме того, диспетчер транзакций отвечает за управление результатами транзакций.
После успешного завершения каждого из событий и транзакции в целом, диспетчер выполняет процедуру двухфазной фиксации транзакции (см. ниже).
Фаза 1
Диспетчер транзакций запрашивает
статус каждого из вовлеченных в транзакцию компонентов (ожидаемый успех/неудача
операции).
В зависимости от статуса компонента вторая фаза фиксации может развиваться по
одному из двух возможных сценариев.
Фаза 2 (сценарий 1)
Если каждый из опрошенных
компонентов сообщит об успехе операции, диспетчер фиксирует новый статус для
каждого компонента и для всей транзакции в целом.
Фаза 2 (сценарий 2)
Если один или несколько участвующих в транзакции компонентов сообщает о неудаче операции, диспетчер транзакций отменяет всю транзакцию, что может повлечь за собой отмену изменений, относящихся к содержимому баз данных.
Роль компонента 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
Приложение Sample Bank реализует сервисы, создающие инфраструктуру для поддержки выполнения программы в изолированной БД, создающие новые счета и удаляющие старые, открывающие и закрывающие счета, позволяет класть и снимать со счета денежные суммы, а также просматривать баланс.
Это приложение позволяет проверить взаимодействие установленной программы MTS с Gupta SQLBase 8.0, а также обрести навыки распределения пакетов и администрирования.
Компоненты программы Sample Bank написаны на языке 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. Программа называется "MTS_TD_Client_with_OLEDB.app". Перейдя к строке меню "ActiveX Explorer", выберите COM под названием "MTS_TD 1.0 Type Library" и сгенерируйте APL для всех классов CoClasses и интерфейсов. Выполните компиляцию и сохраните APP. Создайте выполняемую программу "MTS_TD_Client_with_OLEDB.exe".
Нажмите кнопку "Start", выберите строку "Run" и введите "MMC". Воспользуйтесь командой "Add/Remove Snap-In". Щелкните кнопку с надписью "Add". Выберите 3 интегрируемых приложения (Snap-In): Component Services, Services и SQLBase Services. Щелкните кнопку "Close", затем - кнопку "OK" и сохраните файл под именем MTS_TD.
Порядок добавления пакетных компонентов и транзакций в программу Sample Bank:
a) в ходе выполнения первой
транзакции создаются таблицы базы данных фиктивного банка с временными записями;
б) запуск процесса обращения к серверу требует привлечения системных ресурсов;
в) подключение к базе данных также является ресурсоемкой операцией.
Чтобы установить атрибуты транзакции для компонентов, выполните следующие действия:
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
Обсудить на форуме Gupta Technologies
INTERFACE Ltd. |
|