38 votes

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.

"L'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 fait quelques chagnes sur la base des commentaires. Maintenant j'ai cette erreur:

{"Error HRESULT E_FAIL has been returned from a call to a COM component."}
{"Communication with the underlying transaction manager has failed."}

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

Voici la liste des propriétés sur le serveur:

Server

34voto

ahsteele Points 12230

Vous devez activer l'accès DTC réseau comme décrit dans cet 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: Security Configuration Screenshot

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 suggestion intéressante:

Un autre paramètre de configuration que vous devez être au courant (bien que je considère c'est un scénario rare) est RestrictRemoteClients clé de registre. Si la valeur de cette clé est définie sur 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH) puis MSDTC réseau de transactions ne seront pas afin de pouvoir fonctionner correctement. MSDTC prend en charge seulement RPC_RESTRICT_REMOTE_CLIENT_NONE (0) et RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1) des valeurs. Voir http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 pour plus d'informations sur RestrictRemoteClients.

Enfin, bien que non spécifiques à votre question une chose très importante à noter à propos de l'utilisation de l' 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'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
}

3voto

Otávio Décio Points 44200

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.

2voto

Reed Copsey Points 315315

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

De plus, si vous utilisez plusieurs ressources, un DTC peut être requis. 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 faisable dans les transactions légères.

1voto

Mia Clarke Points 4525

Vous devez 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 Component Services.

0voto

Neil Barnwell Points 20731

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X