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 cet espace de noms 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, quand le code de votre application vérifie la propriété statique Current, System.Transactions recherche une transaction autre que celle qui est 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.

None, comme son nom l’indique, implique qu’il n’y ait pas d’interopérabilité entre les contextes et les étendues de transaction de System.EnterpriseServices. 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. Il s'agit du mode de fonctionnement le plus rapide pour System.Transactions, car il n'existe aucune synchronisation supplémentaire. None est la valeur par défaut utilisée par TransactionScope avec tous les constructeurs qui n'acceptent pas EnterpriseServicesInteropOption comme 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 spécifie les conditions 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 est vérifié pour voir s’il existe une transaction. Cette vérification entraîne :

  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 existe un contexte COM+, une transaction est créée et attaché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 Aucun Automatique Complète
Contexte par défaut Contexte par défaut Contexte par défaut Créer nouveau
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 Aucun Automatique Complète
Contexte par défaut ST ST ES
Contexte autre que celui par défaut ST ES ES

Dans le tableau précédent :