Евгений Марков, Генеральная Сервисная Компания (Санкт-Петербург)
Источник: IT News
2005-11-10
Для распределенных приложений большое значение имеют вопросы обеспечения надежности, производительности, масштабируемости. Технология COM+ (старое название Microsoft Transaction Server, MTS) входит в состав серверных операционных систем Microsoft и предназначена для поддержки систем обработки транзакций.
COM+ может устанавливаться и работать на компьютерах с операционными системами Windows 95/98, Windows NT, Windows XP, Windows 2000, Windows 2003. Однако необходимо отметить, что система безопасности транзакций не реализована для операционных систем Windows 95/98 вследствие объективных ограничений, накладываемых этими системами.
Технология COM+ базируется на возможностях COM и обеспечивает поддержку распределенных приложений на компонентной основе. Объекты транзакций COM+ обладают основными свойствами объектов COM. Кроме этого, объекты транзакций реализуют специфические возможности, присущие только объектам MTS:
Разработчики, использующие COM+ в своих приложениях, создают объекты бизнес-логики, удовлетворяющие требованиям к объектам COM+; затем компилируют их и устанавливают в среде COM+ при помощи пакетов. Пакет COM+ представляет собой контейнер, обеспечивающий группировку объектов в целях защиты данных, улучшения управления ресурсами и увеличения производительности. Управление пакетами осуществляется при помощи утилиты MTS Explorer.
IobjectControl.Сохранение состояния объекта требует, чтобы тот оставался активным и сохранял такие ценные ресурсы как, например, соединение с базой данных. На практике это означает не что иное, как работу с глобальными переменными, потому что именно в них хранится промежуточное состояние объекта.
Если объект не может сохранять свое промежуточное состояние, то он относится к типу stateless. Объекты этого типа более эффективны. Когда транзакция успешно завершена или прервана, все объекты, вовлеченные в транзакцию, деактивируются и, соответственно, теряют информацию о своем состоянии, приобретенную во время транзакции. Это помогает убедиться в изоляции транзакции и согласованности базы данных, а также освобождает ресурсы сервера для использования другими транзакциями. Завершение транзакции позволяет COM+ деактивировать объект и обновить ресурсы.
ItransactionContext. Однако существует возможность и автоматического управления транзакциями.
Атрибуты транзакций можно устанавливать тремя способами:
IobjectContext.
Два метода интерфейса определяют способ выхода объекта из транзакции.
Метод SetComplete сообщает транзакции, что он готов к завершению своей работы в транзакции.
Использование метода SetAbort означает, что исполнение кода объекта привело к возникновению обстоятельств, препятствующих успешному завершению транзакции.
После использования любого из этих двух методов объект завершает свое участие в транзакции.
Методы EnableCommit и DisableCommit сообщают о текущем состоянии объекта. Метод EnableCommit сообщает, что объект позволяет завершить транзакцию, хотя его функционирование еще не завершено.

Рис. 1. Роль контекста объекта COM+
Вызов метода DisableCommit показывает, что в настоящий момент текущее состояние объекта не позволяет завершить транзакцию. При попытке завершить транзакцию после вызова этого метода, транзакция будет прервана.
При помощи перечисленных методов объект контекста обеспечивает среду COM+ информацией о состоянии объекта транзакции.
Например, распределитель ресурсов может использовать контекст объекта COM+ для обеспечения сервисов на основе транзакций. Пусть объект выполняется внутри транзакции, которая зарезервировала соединение с базой данных, используя провайдер ADO. Это соединение автоматически организует транзакцию. Все изменения в базе данных, использующие такое соединение, становятся частью транзакции и затем либо принимаются, либо откатываются.
Дополнительно разработчики могут использовать несколько вспомогательных методов интерфейса IobjectContext.
По умолчанию в среде COM+ настроен пакет System Package, для которого предопределены две роли: администратора (Administrator) и читателя (Reader). Перед началом работы необходимо связать роль администратора с хотя бы одной учетной записью.
IsSecurityEnabled и IsCallerInRole интерфейса IobjectContext этого объекта. Программная защита данных проектируется на этапе разработки приложения и исполняется при функционировании приложения, использующего данный объект COM+.
Когда приложение пытается использовать некоторый объект COM+, необходимо применить метод IsCallerInRole. В качестве параметра метода передается роль, исполняемая приложением. Если объект или пакет COM+ разрешен для роли, его использование разрешается и метод возвращает значение True.
Если же несколько объектов MTS используются в рамках одного процесса, метод IsCallerInRole возвращает True всегда. В этом случае для более точной идентификации применяется метод IsSecurityEnabled.
В процессе работы приложения часто бывает необходимо использовать один экземпляр объекта COM+ несколько раз через определенные промежутки времени. При обращении к объекту он активизируется, а некоторое время после прекращения использования приложение удерживает ссылку на неиспользуемый объект.
Когда создается объект как часть среды COM+, также создается соответствующий контекст объекта. Этот контекст объекта существует в течение всего времени жизни соответствующего объекта COM+, через один или несколько циклов. COM+ использует контекст объекта для сохранения информации о нем при деактивизации.
Объект создается в неактивном состоянии и становится активным только после запроса клиента.
Когда объект становится неактивным, среда уничтожает все ресурсы объекта, в том числе, например, соединение к базе данных.
Объект COM+ становится неактивным при возникновении следующих событий:
SetComplete или SetAbort интерфейса IobjectContext. Если объект вызывает метод SetComplete, когда он успешно завершил свою работу и нет необходимости сохранять внутреннее состояние объекта для следующего вызова клиента. Если объект вызывает SetAbort, указывая на невозможность успешного завершения своей работы и отсутствие необходимости сохранения состояния объекта. После чего объект возвращается в состояние предшествующее этой транзакции. При нормальной реализации stateless-объекта деактивизация происходит после вызова каждого метода.
Рассмотрим, например, соединение с базой данных через провайдер ADO. Известно, что выделение ресурсов, открытие и закрытие соединения с базой данных занимает довольно много времени. Частое повторение этой операции различными объектами COM+ применительно к одной базе данных вызовет повышенный расход ресурсов.
Именно в таких случаях и используется пулинг ресурсов. Соединение с базой данных, больше не используемое одним серверным объектом, может быть использовано другим объектом.
Для выполнения задач пулинга ресурсов COM+ использует распределитель ресурсов.
SetComplete и SetAbort после обслуживания запроса клиента. Эти методы освобождают ресурсы, зарезервированные распределителем ресурсов COM+.
В то же самое время необходимо освобождать ссылки на другие ресурсы, включая ссылки на другие объекты (и объекты COM+ и контексты объектов) и память, занятую экземплярами компонентов. Этого не следует делать лишь в случае, если надо сохранить информацию о состоянии между вызовами клиентов.

Рис. 2. Схема пулинга объектов COM+
Суть этого механизма проста.
При выполнении приложений в среде COM+ создается специальный пул объектов.
Для управления пулом и размещения в нем объектов используется интерфейс IobjectControl. Если объект предназначен для использования в пулинге, то метод CanBePooled-интерфейса должен возвращать значение True.
После деактивизации такого объекта сервер COM+ помещает его в пул. Объекты внутри пула доступны для немедленного использования любыми другими запросами клиентов. В случае если объект запрошен, но пул объектов пуст, MTS автоматически создает новый экземпляр объекта.
При отладке объектов COM+ необходимо отключить этот параметр (присвоить значение, равное нулю), иначе объект может быть выгружен средой, пока вы работаете с исходным кодом или значениями переменных в процессе отладки.
В стадии разработки компонент нельзя перекомпилировать, пока он находится в памяти. В этом случае появится сообщение об ошибке "Cannot write to DLL while executable is loaded.". Для устранения такой ситуации необходимо с использованием MTS Explorer установить в свойствах пакета параметр shut down after being idle for 3 minutes, изменив соответственно время.
Для этого надо:
SetComplete и SetAbort интерфейса IobjectContext (см. выше).
Действие - это совокупность объектов, которые действуют сообща в интересах единственного клиента. Действие может содержать объекты из разных пакетов. Каждый объект COM+ существует только в одном действии, хотя действие может содержать несколько объектов. Каждая транзакция существует только в одном действии, хотя действие может содержать несколько транзакций.
Программирование для COM+ подразумевает, что объекты COM+ не должны разделяться между действиями. Параллельное использование объектов внутри действия очень опасно, поскольку возможна ситуация, когда объект, работающий в интересах одного потока, может попытаться принять транзакцию, пока объект, работающий в интересах второго потока, находится в процессе выполнения работы внутри той же транзакции. Если транзакция была действительно принята, это привело бы к фиксации частично выполненной транзакции.