Comment utiliser TransactionScope en C#?
Je suis en train d'utiliser TransactionScope
, mais l'exception ci-dessous.
L'application est en cours d'exécution sur une autre machine que la base de données, si ce qui compte. Je suis à l'aide de SQL Server 2005.
D'accès au réseau pour la distribution de Gestionnaire de Transactions (MSDTC) a été désactivé. S'il vous plaît activer DTC pour l'accès au réseau dans la configuration de la sécurité
pour MSDTC à l'aide de l'outil d'Administration Services de Composants.
using (TransactionScope tsTransScope = new TransactionScope())
{
//Do stuff here
tsTransScope.Complete();
}
Modifier
J'ai apporté quelques modifications en fonction de la rétroaction. Maintenant j'ai cette erreur:
"Erreur HRESULT E_FAIL a été renvoyé à partir d'un appel à un composant COM."
"La Communication avec le sous-jacent gestionnaire de transactions a échoué."
Solution
Je pense que l'on a accepté de répondre fixe la première question que je recevais. La 2ème erreur semble être spécifique à Entity Framework. Je vais poster une autre question pour elle.
Voici la liste des propriétés sur le client:
Client http://www.portnine.com/data/images/Misc/client.jpg
Voici la liste des propriétés sur le serveur:
Serveur http://www.portnine.com/data/images/Misc/server.jpg
- NotDan avez-vous encore les images que vous avez eu liée à courir? Si oui ce serait super de les rediffuser à corriger le fait qu'ils sont actuellement cassé références sur l'image.
Vous devez vous connecter pour publier un commentaire.
Vous devez activer l'accès DTC réseau comme décrit dans cette Article Microsoft TechNet. Cette modification peut être faite sur la base de données et serveurs d'applications. Souvent DTC est déjà activé sur un serveur de base de données, donc je regarderais le serveur de l'application de la première.
Voici une capture d'écran de ce que nous utilisons à l'exception du "Autoriser l'Administration à Distance" option:
Je n'ai pas couru dans le HRESULT E_Fail problème que vous êtes maintenant, mais cet article sur XP SP2 et les transactions eu cette intéressante suggestion:
Enfin, bien que non spécifiques à votre question une chose très importante à noter à propos de l'utilisation de la
TransactionScope
classe, c'est que le réglage par défaut est d'utiliser un Niveau d'Isolation des transactions Serializable. Serializable est la plus restrictive des niveaux d'isolement et franchement surprenant qu'il a été choisi en tant que par défaut. Si vous n'avez pas besoin de ce niveau de verrouillage, je voudrais vous recommandons vivement de définir le niveau d'isolation d'une manière moins restrictive option (ReadCommitted) lors de l'instanciation d'unTransactionScope
:Panneau de configuration - Outils d'Administration - Services de Composants - Mon Ordinateur propriétés - onglet MSDTC - Configuration de la Sécurité de l'onglet Accès DTC Réseau (vérifié) /Autoriser les Clients à Distance (vérifié) /Autoriser les connexions Entrantes (vérifié) /Autoriser les Sortants (vérifié) /Activer la POINTE de Transactions (vérifié)
De redémarrer l'ordinateur.
Selon le backend que vous utilisez, TransactionScope nécessite souvent la Transaction Distribuée Manager pour être activé. Certains détails sont sur ce blog MSDN.
Aussi, si vous utilisez plusieurs ressources, le DTC peut être nécessaire. Activation de la DTC peut être nécessaire dans votre situation, ou de faire en sorte que vous êtes à l'aide de SQL Server 2005 et le coller à ce qui serait faisable en léger transactions.
Vous devez activer le DTC pour l'accès au réseau dans la configuration de la sécurité pour MSDTC à l'aide de l'outil d'Administration Services de Composants.
Si vous utilisez SQL Server 2000,
System.Transactions.TransactionScope
sera la cause de toutes les transactions à être promus à des Transactions Distribuées, nécessitant MS Coordinateur de Transactions Distribuées à être en cours d'exécution.Vous pouvez résoudre ce problème en démarrant le service MSDTC, la mise à niveau vers SQL Server 2005, ou de mettre en œuvre quelque chose comme mon codeproject solution: 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 Ocdecio réponse pour configurer les paramètres de sécurité réseau pour DTC, trop.
Vous devez activer l'accès DTC réseau pour le serveur de base de données et le serveur sur lequel l'application s'exécute.
Vous aurez également besoin de vérifier que les connexions ne seront pas bloqués par un pare-feu. Etant donné qu'une connexion sera lancé à partir de la base de données du serveur de l'application de la machine, il est également important d'ajouter MSDTC à la liste des exceptions du pare-feu sur l'application de la machine.
J'ai eu le même problème l'exécution des tests d'intégration.
J'ai posté une question à propos de cette ici
mais finalement, j'ai trouvé un moyen de contourner cela. Bien que, je ne recommanderais pas le faire que pour la production de code. Je le faisais dans le contexte de l'essai.