Le gestionnaire de transactions a désactivé son support pour les 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é son support pour les 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 pouvais-je faire pour résoudre le problème?

67
demandé sur MikeTheLiar 2012-04-12 23:53:20

7 réponses

s'assurer que le service de" coordonnateur des transactions distribuées " est fonctionnant à la fois sur la base de données et sur le client. Assurez-vous également de cocher "Accès réseau DTC", " autoriser le Client distant", "Allow Inbound / Outbound" et "Enable TIP".

Pour permettre l'Accès DTC Réseau pour les transactions MS DTC

  1. ouvrez le snap-in des 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. étendre l'arborescence de la console pour localiser le DTC (par exemple, DTC Local) pour lequel vous voulez activer L'accès réseau MS DTC.

  3. dans le menu Action, cliquez Propriétés.

  4. cliquez sur L'onglet Sécurité et apportez les modifications suivantes: Dans Paramètres de sécurité, sélectionnez la case à cocher "Accès réseau DTC".

    In Communication du gestionnaire de transactions, sélectionnez les cases "Autoriser L'arrivée" et "autoriser l'arrivée".

111
répondu Magnus 2017-06-19 07:03:19

j'ai eu ce problème par intermittence, j'avais suivi les instructions ici et très semblables ailleurs. Tout a été configuré correctement.

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

en gros, j'avais des CID en double pour le MSDTC sur les deux serveurs. HKEY_CLASSES_ROOT\CID

voir: http://msdn.microsoft.com/en-us/library/aa561924.aspx section S'assurer que MSDTC se voit attribuer une valeur unique D'IDC

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. Mais le service DTC avait besoin d'un réglage de démarrage automatique et devait être démarré après la réinstallation.

9
répondu Tod 2017-10-02 14:52:41

Commentaire d'un autre réponse : "assurez-vous d'utiliser la même connexion ouverte pour tous les appels de base de données à l'intérieur de la transaction. – Magnus" (je Ne sais pas comment lier les commentaires)

nos utilisateurs sont stockés dans un db séparé des données que je travaillais avec dans les transactions. Ouvrir la connexion db pour obtenir l'utilisateur causait cette erreur pour moi. Le déplacement de l'autre connexion db et de la recherche de l'utilisateur en dehors du champ de la transaction erreur.

4
répondu Bakanekobrain 2017-05-23 12:18:14

dans mon scénario, l'exception était lancée parce que j'essayais de créer une nouvelle instance de connexion dans un champ 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.
    }
}
2
répondu Daniel Minnaar 2017-03-09 09:36:34

j'ai eu une procédure de magasin qui appelle une autre procédure de magasin dans"serveur lié".quand je l'exécute dans ssms, c'est ok,mais quand je l'appelle dans application(par Entity Framework),j'ai cette erreur. Cet article m'a aidé 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 cette: serveur lié : le gestionnaire de transactions partenaire a désactivé son support pour les transactions distantes/réseau

2
répondu Amirhossein Yari 2017-06-07 15:28:30

je poste la solution ci-dessous car après quelques recherches c'est là que j'ai atterri, donc d'autres peuvent aussi. J'ai essayé D'utiliser EF 6 pour appeler une procédure stockée, mais j'ai eu une erreur similaire parce que la procédure stockée avait un serveur lié être utilisé.

L'opération n'a pas pu être effectuée parce que le fournisseur OLE DB _ pour le serveur lié _ n'a pas été en mesure de commencer une transaction distribuée

Le gestionnaire de transactions partenaire a désactivé son soutien à distance/réseau de transactions*

Sautant Client SQL n'a résoudre mon problème, qui a également confirmé que pour moi, c'était un EF chose.

modèle EF méthode de génération de base de la tentative:

db.SomeStoredProcedure();

ExecuteSqlCommand based attent:

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 un peu plus pratique pour déboguer et passer à travers.

Je ne crois pas que Sql Client soit nécessairement un choix préféré, mais j'ai pensé que cela valait au moins la peine de partager si quelqu'un d'autre ayant des problèmes similaires atterrit ici par google.

le Code ci-dessus est C#, mais le concept d'essayer de passer au Client Sql s'applique toujours. Au moins, il sera diagnostique de tenter de faire.

1
répondu Greg 2018-05-10 16:59:02

dans le cas où d'autres ont la même question:

j'ai eu une erreur similaire. il s'est avéré que j'emballais plusieurs déclarations SQL dans une transaction, où l'une d'elles exécutée sur un serveur lié (déclaration de fusion dans un EXEC(...) À la déclaration du serveur). J'ai résolu le problème en ouvrant une connexion séparée au serveur lié, encapsulant cette déclaration dans un essai...attraper puis annuler la transaction sur la connexion d'origine en cas de déclenchement de la capture.

0
répondu aggaton 2015-11-17 00:06:13