Partager via


Interopérabilité avec les services d’entreprise et les transactions COM+

L’espace System.Transactions de noms 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 lorsque vous créez une TransactionScope instance pour spécifier le niveau d’interopérabilité avec COM+.

Par défaut, lorsque votre code d'application vérifie la propriété statique Current, System.Transactions tente de rechercher une transaction qui serait autrement existante ou un objet TransactionScope qui indique que Current est nul. S’il ne trouve pas l’un de ces éléments, System.Transactions interroge le contexte COM+ pour une transaction. Notez que même si System.Transactions peut trouver une transaction à partir du contexte COM+, il privilégie toujours les transactions natives à System.Transactions.

Niveaux d’interopérabilité

L’énumération EnterpriseServicesInteropOption définit les niveaux d’interopérabilité suivants :NoneFull et Automatic.

La TransactionScope classe fournit des constructeurs qui acceptent EnterpriseServicesInteropOption comme paramètre.

None, comme le nom l’indique, implique qu’il n’existe aucune interopérabilité entre System.EnterpriseServices les contextes et les étendues de transaction. Après avoir créé un TransactionScope objet avec None, toutes les modifications à Current ne sont pas reflétées dans le contexte COM+. De même, les modifications apportées à la transaction dans le contexte COM+ ne sont pas reflétées dans Current. Il s’agit du mode d’opération le plus rapide pour System.Transactions lequel aucune synchronisation supplémentaire n’est requise. None est la valeur par défaut utilisée par TransactionScope pour tous les constructeurs qui n’acceptent pas EnterpriseServicesInteropOption comme paramètre.

Si vous souhaitez combiner System.EnterpriseServices transactions avec votre transaction ambiante, vous devez utiliser soit Full soit Automatic. Ces deux valeurs s’appuient sur une fonctionnalité appelée services sans composants. Par conséquent, vous devez être en cours d’exécution sur Windows XP Service Pack 2 ou Windows Server 2003 lors de leur utilisation.

Full spécifie que les transactions ambiantes pour System.Transactions et System.EnterpriseServices sont toujours identiques. Elle entraîne la création d’un nouveau System.EnterpriseServices contexte transactionnel et l'application de la transaction qui est actuelle pour le TransactionScope, afin qu'elle soit actuelle pour ce contexte. Par conséquent, la transaction dans Current est entièrement synchronisée avec la transaction dans Transaction. Cette valeur introduit une pénalité de performances, car de nouveaux contextes COM+ peuvent être créés.

Automatic spécifie les conditions suivantes :

  • Lorsqu’elle Current est cochée, System.Transactions doit prendre en charge les transactions dans le contexte COM+ si elle détecte qu’elle s’exécute 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 stockée dans le stockage local de thread utilisé par System.Transactions est retournée pour Current.

  • Si un nouvel TransactionScope objet est créé et que la création se produit dans un contexte autre que le contexte par défaut, la transaction actuelle de l’objet TransactionScope doit être reflétée dans COM+. Dans ce cas, Automatic se comporte comme Full en ce sens qu'il crée un nouveau contexte COM+.

En outre, lorsqu’il Current est défini dans les deux Full et Automatic, ces deux modes impliquent qu’il Current ne peut pas être défini directement. Toute tentative de définition directe de Current autre que la création d’un TransactionScope entraîne un InvalidOperationException. La EnterpriseServicesInteropOption valeur d’énumération est héritée par de nouvelles étendues de transaction qui ne spécifient pas explicitement la valeur à utiliser. Par exemple, si vous créez un TransactionScope objet avec Full, puis créez un deuxième TransactionScope objet, mais ne spécifiez pas de EnterpriseServicesInteropOption valeur, le deuxième TransactionScope objet a également un 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 aboutit à :

  2. La valeur de l’énumération TransactionScopeOption passée par le TransactionScope constructeur est vérifiée. Cela détermine si une nouvelle transaction doit être créée.

  3. Si une nouvelle transaction doit être créée, les valeurs suivantes du EnterpriseServicesInteropOption résultat sont les suivantes :

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

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

    • Automatic: s’il existe un contexte COM+, une transaction est créée et attachée au contexte.

Le tableau suivant illustre le contexte des Services d’entreprise (ES) et un périmètre transactionnel qui requiert une transaction à l’aide de l’énumération EnterpriseServicesInteropOption.

Contexte ES Aucun Automatique Complet
Contexte par défaut Contexte par défaut Contexte par défaut Créer nouveau
contexte transactionnel
Contexte non par défaut Gérer le contexte du client Créer un contexte transactionnel Créer un contexte transactionnel

Le tableau suivant illustre ce que la transaction ambiante est, en fonction d’un contexte particulier System.EnterpriseServices et d’une étendue transactionnelle qui nécessite une transaction à l’aide de l’énumération EnterpriseServicesInteropOption .

Contexte ES Aucun Automatique Complet
Contexte par défaut ST ST ES
Contexte non par défaut ST ES ES

Dans le tableau précédent :