MSDTC problème avec les opérations dans ADO.NET Entity Framework
dans notre projet, nous sommes à l'aide de ADO.NET Entity Framework comme couche de données de l'application. Il y a certaines tâches qui exigent d'exécuter une transaction, car il y a beaucoup de travail à faire dans la base de données. Je suis à l'aide d'un TransactionScope pour entourer ces tâches.
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
//Do something...
transactionScope.Complete();
}
Le problème est que dès que je suis en utilisant un TransactionScope une exception se produit:
Système.Les données.EntityException: Le fournisseur sous-jacent échoué sur Ouvrir. ---> Système.Des Transactions.TransactionManagerCommunicationException: la Communication avec le sous-jacent gestionnaire de transactions a échoué. ---> Système.Moment de l'exécution.InteropServices.COMException (0x80004005): Erreur HRESULT E_FAIL a été renvoyé à partir d'un appel à un composant COM.
Il semble que cette erreur a faire quelque chose avec le MSDTC (Microsoft Distributed Transaction Coordinator). Lorsque je change la configuration de la sécurité de MSDTC une autre exception est levée:
Système.Les données.EntityException: Le fournisseur sous-jacent échoué sur Ouvrir. ---> Système.Des Transactions.TransactionManagerCommunicationException: 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.
Cependant MSDTC est configuré, le TransactionScope provoquera une erreur.
Est-ce que qqn sait ce qui se passe mal ici?
OriginalL'auteur Alexander | 2009-10-23
Vous devez vous connecter pour publier un commentaire.
Par défaut MSDTC a accès au réseau désactivé. Pour le faire fonctionner vous devez vous rendre à
et cochez les cases suivantes l'Accès DTC Réseau, Autoriser les connexions Entrantes, Permettre Sortant. L'Authentification doit être choisi en fonction de votre environnement. Vous pouvez également jeter un oeil à DTCPing outil de débogage des transactions distribuées. Pour vous donner un raccourci - vous devrez peut-être modifier votre registre:
pour faire fonctionner tout ça.
Pour Windows 8, la "Configuration de la Sécurité" peut être trouvé ici: stackoverflow.com/questions/7694/...
OriginalL'auteur Nikolay R
Oui, il fonctionne en utilisant le Supprimer, parce que vous êtes en disant qu'il le supprimer ou ignorer l'ambiance de la transaction et de créer une nouvelle transaction locale. Puisque la transaction est local, il n'est pas une transaction distribuée donc ce n'est pas à l'aide de MSDTC, mais vous ne devriez pas utiliser Réprimer et doit utiliser à la place.
OriginalL'auteur Bill
Cela signifie qu'il est la suppression de toute Opération qui pourrait être en vigueur actuellement, lorsque vous entrez votre code de bloc, de sorte que toute les mises à jour de votre code ne sera pas la restauration si l'extérieur "ambiante" transaction décide de restauration.
OriginalL'auteur SpockMonster
C'est l'article que nous avons utilisé dans la résolution de notre propre, problème similaire:
La résolution des Problèmes de MSDTC
C'est fondamentalement un addendum à Nikolay R réponse. Il a déjà couvert les suggestions énumérées dans l'article.
Remarque: L'article fait partie de la documentation Biztalk, mais elle peut s'appliquer à n'importe quoi à l'aide de MSDTC.
OriginalL'auteur John Allers
"Si vous êtes en utilisant Entity Framework avec des Transactions de l'Entité Cadre s'ouvre et se ferme automatiquement une connexion avec chaque base de données d'appel. Donc, lorsque vous utilisez les transactions, vous tentez de propagation d'une transaction sur les connexions multiples. Cela élève à MSDTC."
Vous pouvez passer votre contexte de base de données appelé classe ou d'une fonction dans votre transaction.
C'est peut-être votre réponse: MSSQL Erreur "Le fournisseur sous-jacent échoué sur Ouvrir"
OriginalL'auteur Jim Chen
Supressing l'opération est utile si vous voulez exécuter du code qui peut échouer, mais vous ne voulez pas annuler la transaction en raison de l'échec.
La question que vous devez vous poser est la suivante:
Êtes-vous accès à plus de 1 durable de cette ressource dans votre transactionScope? Je veux dire, vous faire ouvrir les connexions à plus de 1 DB?
Cette question est importante, car l'opération va être transférés vers DTC si vous accédez à plus de 1 durable de cette ressource.
Au moins deux ressources durables qui prennent en charge une seule phase de notifications sont enrôlés dans la transaction. Par exemple, l'enrôlement d'une connexion unique à ne pas provoquer une promotion de la transaction. Cependant, chaque fois que vous ouvrez une deuxième connexion à une base de données causant la base de données pour s'enrôler, le Système.Les opérations d'infrastructure détecte que c'est la deuxième durable de cette ressource dans la transaction, et s'intensifie à un MSDTC transaction.
Source: MSDN
Si c'est le cas, vous pouvez résoudre votre problème par l'imbrication votre transactionscopes correctement, exemple:
}
Vous pouvez trouver plus d'infos sur TransactionScopes, comment l'imbrication des œuvres,... sur MSDN.
J'espère que cette réponse peut aider les gens dans le futur.
OriginalL'auteur Bram Van Strydonck
Si Distributed Transaction Coordinator service n'est pas démarré, Entity framework ne peut pas se connecter à la base de données.
Ouvrir et démarrer le Coordinateur de Transactions Distribuées
Services -> Distributed Transaction Coordinator
OriginalL'auteur aydnahmet
Hmm, il semble que cela fonctionne lorsque je change la TransactionScopeOption à "Supprimer":
Tout le monde sait pourquoi?
Oui, cette option indique qu'il ne devrait pas prendre part à la transaction.
J'obtiens le même message d'erreur, mais il n'y a aucun moyen que ce est la meilleure réponse.
Vérifier ma réponse ci-dessous, je pense que cela devrait résoudre votre problème..
OriginalL'auteur Alexander