Comment utiliser TransactionScope en C #?

J’essaie d’utiliser TransactionScope , mais je reçois toujours l’exception ci-dessous.
L’application est exécutée sur une machine différente de celle de la firebase database, si cela compte. J’utilise SQL Server 2005.

L’access réseau pour MSDTC (Dissortingbuted Transaction Manager) a été désactivé. Activez DTC pour l’access au réseau dans la configuration de la sécurité pour MSDTC à l’aide de l’outil d’administration des services de composants.

 using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); } 

modifier

J’ai apporté des modifications en fonction des commentaires. Maintenant, je reçois cette erreur:

“L’erreur HRESULT E_FAIL a été renvoyée à partir d’un appel à un composant COM.”
“La communication avec le gestionnaire de transactions sous-jacent a échoué.”

Solution Je pense que la réponse acceptée a résolu le problème initial que je rencontrais. La deuxième erreur semble être spécifique à Entity Framework. Je vais poster une autre question pour cela.

Voici les propriétés sur le client:
Client http://soffr.miximages.com/transactions/client.jpg

Voici les propriétés sur le serveur:
Serveur http://soffr.miximages.com/transactions/server.jpg

Vous devez activer l’access DTC au réseau, comme décrit dans cet article Microsoft TechNet . Cette modification devra peut-être être effectuée à la fois sur la firebase database et sur les serveurs d’applications. Souvent, DTC est déjà activé sur un serveur de firebase database, je commence donc par examiner le serveur d’applications.

Voici une capture d’écran de ce que nous utilisons sauf l’option “Autoriser l’administration à distance”: Capture d'écran de la configuration de sécurité

Je n’ai pas encore rencontré le problème HRESULT E_Fail que vous rencontrez maintenant, mais cet article sur XP SP2 et les transactions contenait cette suggestion intéressante:

Un autre paramètre de configuration que vous devez connaître (même si j’estime qu’il s’agit d’un scénario inhabituel) est la clé de registre RessortingctRemoteClients. Si la valeur de cette clé est définie sur 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH), les transactions réseau MSDTC ne pourront pas fonctionner correctement. MSDTC prend uniquement en charge les valeurs RPC_RESTRICT_REMOTE_CLIENT_NONE (0) et RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1). Voir http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 pour plus d’informations sur RessortingctRemoteClients.

Enfin, bien que n’étant pas spécifique à votre problème, il est important de noter que l’utilisation de la classe TransactionScope est que son paramètre par défaut consiste à utiliser un niveau d’isolation de transaction de Serializable . Serializable est le plus ressortingctif des niveaux d’isolation et franchement, il est surprenant qu’il ait été choisi par défaut. Si vous n’avez pas besoin de ce niveau de locking, je vous recommande fortement de définir le niveau d’isolation sur une option moins ressortingctive (ReadCommitted) lors de l’instanciation d’un TransactionScope :

 var scopeOptions = new TransactionOptions(); scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; scopeOptions.Timeout = TimeSpan.MaxValue; using (var scope = new TransactionScope(TransactionScopeOption.Required, scopeOptions)) { // your code here } 

Panneau de configuration – Outils d’administration – Services de composant – Propriétés du poste de travail – Onglet MSDTC – Onglet Configuration de la sécurité – Accès au DTC réseau (coché) / Autoriser les clients distants (coché) / Autoriser le trafic entrant (coché) / Autoriser le trafic sortant (coché) / Activer les transactions TIP ( vérifié)

Redémarrer l’ordinateur.

Selon le backend que vous utilisez, TransactionScope nécessite souvent l’activation du gestionnaire de transactions dissortingbuées. Certains détails sont sur ce blog MSDN .

De plus, si vous utilisez plusieurs ressources, un DTC peut être requirejs. L’activation de DTC peut être nécessaire dans votre cas, ou vous assurer que vous utilisez SQL Server 2005 et vous en tenir à ce qui serait réalisable dans les transactions légères.

Vous devez activer DTC pour l’access au réseau dans la configuration de la sécurité pour MSDTC à l’aide de l’outil d’administration Component Services.

Si vous utilisez SQL Server 2000, System.Transactions.TransactionScope entraîne la promotion de toutes les transactions en transactions dissortingbuées, ce qui nécessite l’exécution du coordinateur des transactions dissortingbuées MS.

Vous pouvez résoudre ce problème en démarrant le service MSDTC, en effectuant une mise à niveau vers SQL Server 2005 ou en mettant en œuvre une solution semblable à ma solution codeproject: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

Je n’ai jamais eu besoin de le faire, mais vous devriez également vérifier la réponse d’Ocdecio pour configurer les parameters de sécurité réseau pour DTC.

Vous devez activer l’access DTC réseau pour le serveur de firebase database et le serveur sur lequel l’application est exécutée.

Vous devrez également vérifier que les connexions ne seront pas bloquées par un pare-feu. Etant donné qu’une connexion sera établie depuis le serveur de firebase database vers la machine d’application, il est également important d’append MSDTC à la liste des exceptions de pare-feu sur la machine d’application.

J’ai eu le même problème lors de l’exécution des tests d’intégration.

J’ai posté une question à ce sujet ici

mais finalement j’ai trouvé un moyen de le contourner. Bien que, je ne recommanderais pas cela pour le code de production. Je le faisais dans le contexte des tests.