Поделиться через


Взаимодействие с корпоративными службами и транзакциями COM+

Пространство System.Transactions имен поддерживает взаимодействие между объектами транзакций, созданными с помощью этого пространства имен и транзакций, созданных с помощью COM+.

Перечисление EnterpriseServicesInteropOption можно использовать при создании нового TransactionScope экземпляра для указания уровня взаимодействия с COM+.

По умолчанию, когда код приложения проверяет статическое Current свойство, System.Transactions пытается найти текущую транзакцию, если таковая есть, или объект, который определяет, что TransactionScope имеет значение 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 или Windows Server 2003.

Full указывает, что внешние транзакции для System.Transactions и System.EnterpriseServices всегда одинаковы. Это приводит к созданию нового System.EnterpriseServices контекста транзакций и применению текущей транзакции TransactionScope для данного контекста. Таким образом, транзакция в Current полностью синхронизирована с транзакцией в Transaction. Это значение вводит потерю производительности, так как может потребоваться создать новые контексты COM+.

Automatic указывает следующие требования:

  • Current Если System.Transactions обнаруживает, что он выполняется в контексте, отличном от контекста по умолчанию, 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+.

    • None System.Transactions: создается транзакция.

    • Automatic: если есть контекст COM+, создается транзакция и присоединена к контексту.

В следующей таблице показан контекст корпоративных сервисов (ES) и область транзакций, в рамках которой требуется транзакция с использованием перечисления EnterpriseServicesInteropOption.

Контекст ES Отсутствует Автоматически Полный
Контекст по умолчанию Контекст по умолчанию Контекст по умолчанию Создать новое
контекст транзакций
Контекст, отличный от по умолчанию Поддерживать контекст клиента Создание контекста транзакций Создание контекста транзакций

В следующей таблице показано, что собой представляет окружная транзакция в заданном System.EnterpriseServices контексте и транзакционной области, которая требует транзакции с использованием EnterpriseServicesInteropOption перечисления.

Контекст ES Отсутствует Автоматически Полный
Контекст по умолчанию УЛ УЛ ES
Контекст, отличный от по умолчанию УЛ ES ES

В предыдущей таблице:

  • ST означает, что транзакцией области управляет System.Transactions, отдельно от любой транзакции контекста System.EnterpriseServices, которая может присутствовать.

  • ES означает, что окружающая транзакция области совпадает с System.EnterpriseServices транзакцией контекста.