Взаимодействие с транзакциями Enterprise Services и COM+
Пространство имен System.Transactions поддерживает взаимодействие между объектами транзакций, созданными с помощью этого пространства имен, и транзакциями, созданными с помощью модели COM+.
Чтобы задать уровень взаимодействия с транзакциями COM+ при создании нового экземпляра EnterpriseServicesInteropOption, можно использовать перечисление TransactionScope.
По умолчанию, когда код приложения проверка статического свойства, System.Transactions пытается искать транзакцию, которая в противном случае является текущей, или TransactionScope объект, который определяет Current значение NULL.Current Если ни один из этих элементов не найден, System.Transactions запрашивает транзакцию в контексте COM+. Обратите внимание, что даже если инфраструктура System.Transactions находит транзакцию в контексте COM+, она по-прежнему отдает предпочтение транзакциям, присущим инфраструктуре System.Transactions.
Уровни взаимодействия
Перечисление EnterpriseServicesInteropOption определяет следующие уровни взаимодействия: None, Full и Automatic.
Класс TransactionScope предоставляет конструкторы, принимающие перечисление EnterpriseServicesInteropOption в качестве параметра.
NoneКак подразумевает имя, подразумевает отсутствие взаимодействия между System.EnterpriseServices контекстами и область транзакций. После создания объекта TransactionScope со значением None никакие изменения свойства Current не отражаются в контексте COM+. Аналогичным образом, изменения транзакции в контексте COM+ не отражаются в свойстве Current. Это самый быстрый режим работы System.Transactions, поскольку никакая дополнительная синхронизация не требуется. None - это значение по умолчанию, используемое объектом TransactionScope со всеми конструкторами, не принимающими EnterpriseServicesInteropOption в качестве параметра.
Чтобы объединить транзакции System.EnterpriseServices с внешней транзакцией, необходимо использовать значение Full или Automatic. Оба этих значения основываются на функции "бескомпонентные службы", поэтому их использование возможно на компьютерах под управлением операционных систем Windows XP с пакетом обновления 2 (SP2) или Windows Server 2003.
Значение Full указывает, что внешние транзакции для System.Transactions и System.EnterpriseServices всегда одинаковы. В результате создается новый транзакционный контекст System.EnterpriseServices, и транзакция, являющаяся текущей для объекта TransactionScope, становится текущей для этого контекста. Транзакция в Current полностью синхронизирована с транзакцией в Transaction. Использование данного значения приводит к снижению производительности, поскольку может потребоваться создание новых контекстов COM+.
Automatic указывает следующие требования:
При проверке свойства Current инфраструктура System.Transactions должна поддерживать транзакции в контексте COM+, если обнаруживается, что данный объект выполняется в контексте, отличном от контекста по умолчанию. Обратите внимание, что транзакция не может содержаться в контексте по умолчанию. Таким образом, в контексте по умолчанию для свойства Automatic возвращается транзакция, которая хранится в локальной памяти потока, используемой инфраструктурой System.Transactions, даже если задано значение Current.
Если создание нового объекта TransactionScope происходит в контексте, отличном от контекста по умолчанию, транзакция, являющаяся текущей для объекта TransactionScope, должна быть отражена в контексте COM+. В этом случае использование значения Automatic приводит к тому же самому результату, что и при использовании значения Full - создается контекст COM+.
Кроме того, если для свойства Current определено как значение Full, так и значение Automatic, оба этих режима подразумевают, что свойство Current нельзя задать напрямую. Любая попытка задать свойство Current напрямую без создания объекта TransactionScope приводит к возникновению исключения InvalidOperationException. Значение перечисления EnterpriseServicesInteropOption наследуется новыми областями транзакций, в которых явно не указано, какое значение следует использовать. Например, если создать новый объект TransactionScope со значением Full, а затем создать второй объект TransactionScope без указания значения перечисления EnterpriseServicesInteropOption, второй объект TransactionScope будет также иметь значение Full.
При создании новой области транзакции применяются следующие правила:
Currentпроверка, чтобы узнать, существует ли транзакция. Эта проверка заключается в выполнении следующих действий.
Проверяется существование области.
Если область существует, проверяется значение перечисления EnterpriseServicesInteropOption, переданное при создании области.
Если значением перечисления EnterpriseServicesInteropOption является Automatic, транзакция COM+ (транзакция System.EnterpriseServices) имеет приоритет над транзакцией System.Transactions в локальной памяти управляемого потока.
В случае значения None приоритет имеет транзакция System.Transactions в локальной памяти управляемого потока.
В случае значения Full существует только одна транзакция - транзакция COM+.
Проверяется значение перечисления TransactionScopeOption, переданное конструктором TransactionScope. Это позволяет определить необходимость создания новой транзакции.
Если необходимо создать новую транзакцию, в зависимости от желаемого результата используются различные значения перечисления EnterpriseServicesInteropOption.
Full: позволяет создать транзакцию, связанную с контекстом COM+.
NoneSystem.Transactions: создается транзакция.
Automatic: если есть контекст COM+, создается транзакция и присоединена к контексту.
В следующей таблице представлены контекст Enterprise Services (ES) и область транзакции, запрашивающая транзакцию с помощью перечисления EnterpriseServicesInteropOption.
Контекст ES | нет | Автоматически | Полностью |
---|---|---|---|
Контекст по умолчанию | Контекст по умолчанию | Контекст по умолчанию | Создание нового транзакционный контекст |
Контекст, отличный от контекста по умолчанию | Сохранить контекст клиента | Создать новый транзакционный контекст | Создать новый транзакционный контекст |
В следующей таблице показано, что представляют собой внешняя транзакция в случае конкретного контекста System.EnterpriseServices и область транзакции, запрашивающая транзакцию с помощью перечисления EnterpriseServicesInteropOption.
Контекст ES | нет | Автоматически | Полностью |
---|---|---|---|
Контекст по умолчанию | ST | ST | ES |
Контекст, отличный от контекста по умолчанию | ST | ES | ES |
В приведенной выше таблице:
ST означает, что управление внешней транзакцией области осуществляется инфраструктурой System.Transactions отдельно от любой существующей транзакции контекста System.EnterpriseServices;
ES означает, что внешняя транзакция области совпадает с транзакцией контекста System.EnterpriseServices.