web-dev-qa-db-fra.com

Le gestionnaire de transactions a désactivé sa prise en charge des transactions distantes/réseau

J'utilise SQL Server et ASP.NET. J'ai la fonction suivante:

            Using js = daoFactory.CreateJoinScope()
                Using tran = New Transactions.TransactionScope()
                    '...
                    tran.Complete()
                End Using
            End Using

Cependant, l'exception ' Le gestionnaire de transactions a désactivé sa prise en charge des transactions distantes/réseau. ' Est lancé.

Description de JoinScope:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

J'ai travaillé de cette façon dans une autre application avec le même environnement sans problème, mais ici, j'ai ce problème. Que pourrais-je faire pour résoudre le problème?

72
Lajos Arpad

Assurez-vous que le service "Distributed Transaction Coordinator" est S'exécutant à la fois sur la base de données et sur le client .. Vérifiez également que vous avez coché "Accès réseau DTC", "Autoriser le client distant", et "Activer TIP".

Pour activer l'accès réseau DTC pour les transactions MS DTC

  1. Ouvrez le composant logiciel enfichable Services de composants.

    Pour ouvrir les services de composants, cliquez sur Démarrer. Dans la zone de recherche, tapez dcomcnfg, puis appuyez sur Entrée.

  2. Développez l'arborescence de la console pour localiser le DTC (par exemple, le DTC local) pour lequel vous souhaitez activer l'accès réseau MS DTC.

  3. Dans le menu Action, cliquez sur Propriétés.

  4. Cliquez sur l'onglet Sécurité et apportez les modifications suivantes: Dans Paramètres de sécurité, cochez la case Accès réseau DTC.

    Dans Communication du gestionnaire de transactions, cochez les cases Autoriser le trafic entrant et Autoriser le trafic sortant.

119
Magnus

J'ai eu ce problème de façon intermittente, j'avais suivi les instructions ici et très similaires ailleurs. Tout était configuré correctement.

Cette page: http://sysadminwebsite.wordpress.com/2012/05/29/9/ m'a aidé à trouver le problème.

Fondamentalement, j'avais des identifiants de sécurité en double pour le MSDTC sur les deux serveurs. (HKEY_CLASSES_ROOT\CID} _

Voir: http://msdn.Microsoft.com/en-us/library/aa561924.aspx section Assurez-vous qu'une valeur CID unique est attribuée à MSDTC.

Je travaille avec des serveurs virtuels et notre équipe de serveurs aime utiliser la même image pour chaque serveur. C'est une solution simple et nous n'avons pas besoin d'un redémarrage. Cependant, le service DTC avait besoin d'être défini sur Démarrage automatique et devait l'être après la réinstallation.

10
Tod

J'avais une procédure de magasin qui appelle un autre magasin Procédure dans "serveur lié" .Quand je l'exécute dans SSMS, il était ok, mais lorsque je l'appelle dans application (By Entity Framework), j'ai eu cette erreur . Cet article a aidé moi et j'ai utilisé ce script:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

pour plus de détails, regardez ceci: Serveur lié: le gestionnaire de transactions du partenaire a désactivé sa prise en charge des transactions distantes/réseau

4
Amirhossein Yari

Commentaire de answer : "assurez-vous que vous utilisez la même connexion ouverte pour tous les appels de base de données dans la transaction. - Magnus"

Nos utilisateurs sont stockés dans une base de données distincte des données avec lesquelles je travaillais dans les transactions. Ouvrir la connexion à la base de données pour que l’utilisateur provoque cette erreur pour moi. Le déplacement de l'autre connexion à la base de données et de la recherche d'utilisateur en dehors de la portée de la transaction a corrigé l'erreur. 

3
Bakanekobrain

Dans mon scénario, l'exception était déclenchée car j'essayais de créer une nouvelle instance de connexion dans un TransactionScope sur une connexion déjà existante:

Exemple:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}
3
Daniel Minnaar

Je publie ici la solution ci-dessous car après quelques recherches, c’est là que j’ai atterri, d’autres aussi. J'essayais d'utiliser EF 6 pour appeler une procédure stockée, mais une erreur similaire se produisait car la procédure stockée comportait un serveur lié en cours d'utilisation.

L'opération n'a pas pu être effectuée car le fournisseur de base de données OLE _ pour le serveur lié _ n'a pas pu démarrer une transaction distribuée

Le gestionnaire de transactions du partenaire a désactivé la prise en charge des transactions distantes/réseau *

Sauter vers Client SQL a corrigé mon problème, ce qui a également confirmé pour moi qu’il s’agissait d’un événement EF.

Tentative basée sur une méthode générée par un modèle EF:

db.SomeStoredProcedure();

Tentative basée sur ExecuteSqlCommand:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

Avec:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

Ce code peut être raccourci, mais je pense que cette version est légèrement plus pratique pour le débogage et l’exécution pas à pas.

Je ne crois pas que Sql Client soit nécessairement un choix préféré, mais j’ai estimé que cela valait au moins la peine d’être partagé si quelqu'un d'autre ayant des problèmes similaires se retrouvait ici par Google. 

Le code ci-dessus est en C #, mais le concept d’essai de basculement vers Sql Client s’applique toujours. À tout le moins, il sera diagnostique d'essayer de le faire.

1
Greg

J'ai eu le même message d'erreur. Pour moi, changer pooling=False en ;pooling=true;Max Pool Size=200 dans la chaîne de connexion a résolu le problème.

0
Niels Bijl

Si d'autres ont le même problème: 

J'ai eu une erreur similaire qui se passe. En fait, j’enveloppais plusieurs instructions SQL dans une transaction, l’une d’elles exécutée sur un serveur lié (instruction Merge dans une instruction EXEC (...) AT Server). J'ai résolu le problème en ouvrant une connexion distincte au serveur lié, encapsulant cette instruction dans un essai ... catch puis abandonnant la transaction sur la connexion d'origine au cas où le blocage serait déclenché.

0
aggaton