Взаимодействие с транзакциями 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.

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

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

    • Проверяется существование области.

    • Если область существует, проверяется значение перечисления EnterpriseServicesInteropOption, переданное при создании области.

    • Если значением перечисления EnterpriseServicesInteropOption является Automatic, транзакция COM+ (транзакция System.EnterpriseServices) имеет приоритет над транзакцией System.Transactions в локальной памяти управляемого потока.

      В случае значения None приоритет имеет транзакция System.Transactions в локальной памяти управляемого потока.

      В случае значения Full существует только одна транзакция - транзакция COM+.

  2. Проверяется значение перечисления TransactionScopeOption, переданное конструктором TransactionScope. Это позволяет определить необходимость создания новой транзакции.

  3. Если необходимо создать новую транзакцию, в зависимости от желаемого результата используются различные значения перечисления 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.