Interopérabilité avec Enterprise Services et les transactions COM+

L'espace de noms System.Transactions prend en charge l'interopérabilité entre les objets de transaction créés à l'aide de ce nom d'espaces et les transactions créées via COM+.

Vous pouvez utiliser l'énumération EnterpriseServicesInteropOption lors de la création d'une nouvelle instance TransactionScope pour spécifier le niveau d'interopérabilité avec COM+.

Par défaut, lorsque votre code d'application vérifie la propriété Current statique, System.Transactions tente de rechercher une transaction autre que celle en cours ou un objet TransactionScope qui impose que Current ait la valeur null. S'il n'en détecte pas, System.Transactions recherche une transaction dans le contexte COM+. Notez que même si System.Transactions détecte une transaction à partir du contexte COM+, il privilégie les transactions natives de System.Transactions.

Niveaux d'interopérabilité

L'énumération EnterpriseServicesInteropOption définit les niveaux d'interopérabilité suivants : None, Full et Automatic.

La classe TransactionScope fournit des constructeurs qui acceptent EnterpriseServicesInteropOption en tant que paramètre.

Comme son nom l'indique, None implique qu'il n'y ait pas d'interopérabilité entre les contextes System.EnterpriseServices et les étendues de transaction. Après création d'un objet TransactionScope avec None, les modifications apportées à Current ne sont pas répercutées dans le contexte COM+. De la même façon, les modifications apportées à la transaction du contexte COM+ ne sont pas répercutées dans Current. C'est le mode d'action le plus rapide pour System.Transactions car aucune synchronisation supplémentaire n'est requise. None est la valeur par défaut utilisée par TransactionScope avec tous les constructeurs qui n'acceptent pas EnterpriseServicesInteropOption en tant que paramètre.

Pour associer des transactions System.EnterpriseServices à votre transaction ambiante, vous devez utiliser Full ou Automatic. Ces deux valeurs reposent sur une fonctionnalité appelée services sans composants, vous devez donc utiliser Windows XP Service Pack 2 ou Windows Server 2003 lors de leur exploitation.

Full précise que les transactions ambiantes pour System.Transactions et System.EnterpriseServices sont toujours identiques. Il en résulte la création d'un nouveau contexte transactionnel System.EnterpriseServices et l'application de la transaction en cours pour que TransactionScope soit en cours pour ce contexte. Ainsi la transaction dans Current est entièrement synchronisée avec la transaction dans Transaction. Cette valeur introduit une pénalité de performance car il peut s'avérer nécessaire de créer de nouveaux contextes COM+.

Automatic précise les spécifications suivantes :

  • Si Current est activé, System.Transactions doit prendre en charge les transactions dans le contexte COM+ s'il détecte une exécution dans un contexte autre que le contexte par défaut. Notez que le contexte par défaut ne peut pas contenir de transaction. Par conséquent, dans le contexte par défaut, même avec Automatic, la transaction conservée dans le stockage local des threads utilisé par System.Transactions est retournée pour Current.

  • Si un nouvel objet TransactionScope est créé dans un contexte autre que celui par défaut, la transaction en cours pour l'objet TransactionScope doit être répercutée dans COM+. Dans ce cas, Automatic se comporte comme Full et crée donc un nouveau contexte COM+.

De plus, si Current a les valeurs Full et Automatic, ces deux modes impliquent que Current ne peut pas être défini directement. Toute tentative pour définir Current directement sans créer de TransactionScope entraîne une exception InvalidOperationException. La valeur d'énumération EnterpriseServicesInteropOption est héritée par de nouvelles étendues de transaction qui ne spécifient pas explicitement quelle valeur utiliser. Par exemple, si vous créez un objet TransactionScope avec la valeur Full, puis un second objet TransactionScope sans spécifier de valeur EnterpriseServicesInteropOption, cet objet TransactionScope prend également la valeur Full.

En résumé, les règles suivantes s'appliquent lors de la création d'une nouvelle étendue de transaction :

  1. Current fait l'objet d'une vérification à la recherche de transactions. Cette vérification entraîne :

    • la recherche d'une étendue éventuelle.

    • Si une étendue est détectée, la valeur de l'énumération EnterpriseServicesInteropOption passée lors de la création initiale de l'étendue est contrôlée.

    • Si l'énumération EnterpriseServicesInteropOption a la valeur Automatic, la transaction COM+ (transaction System.EnterpriseServices) est prioritaire sur la transaction System.Transactions du stockage local des threads managés.

      Si elle a la valeur None, c'est la transaction System.Transactions du stockage local des threads managés qui est prioritaire.

      Si la valeur est Full, il n'y a qu'une transaction et il s'agit obligatoirement d'une transaction COM+.

  2. La valeur de l'énumération TransactionScopeOption passée par le constructeur TransactionScope est contrôlée. Cela détermine la nécessité de la création d'une nouvelle transaction.

  3. S'il est nécessaire de créer une nouvelle transaction, les valeurs suivantes de EnterpriseServicesInteropOption sont :

    • Full : une transaction associée à un contexte COM+ est créée.

    • None : une transaction System.Transactions est créée.

    • Automatic : s'il y a un contexte COM+, une transaction est créée et associée au contexte.

Le tableau suivant présente le contexte Enterprise Services (ES) ainsi que l'étendue transactionnelle qui requiert une transaction utilisant l'énumération EnterpriseServicesInteropOption .

Contexte ES None Automatic Full

Contexte par défaut

Contexte par défaut

Contexte par défaut

Créer un contexte transactionnel

Contexte autre que celui par défaut

Conserver le contexte du client

Créer un contexte transactionnel

Créer un contexte transactionnel

Le tableau suivant indique la transaction ambiante, selon un contexte System.EnterpriseServices particulier et une étendue transactionnelle qui requiert une transaction utilisant l'énumération EnterpriseServicesInteropOption.

Contexte ES None Automatic Full

Contexte par défaut

ST

ST

ES

Contexte autre que celui par défaut

ST

ES

ES

Dans le tableau ci-dessus :

  • ST signifie que la transaction ambiante de l'étendue est managée par System.Transactions, indépendamment de l'éventuelle présence de transactions du contexte System.EnterpriseServices.

  • ES signifie que la transaction ambiante de l'étendue est identique à la transaction du contexte System.EnterpriseServices.

Footer image

Copyright ©2007 par Microsoft Corporation. Tous droits réservés.