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

86

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 à distance / 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 puis-je faire pour résoudre le problème?

Lajos Arpad
la source
J'ai d'abord suivi les étapes suggérées par Magnus pour m'assurer que toutes les bases étaient couvertes, pour ainsi dire, puis j'ai réussi à obtenir une erreur suggérant que l'ensemble j'active clr dans SQL Server, et cela a fonctionné pour moi. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Réponses:

141

Assurez-vous que le service «Distributed Transaction Coordinator» est en cours d'exécution sur la base de données et le client. Assurez-vous également de cocher «Accès réseau DTC», «Autoriser le client distant», «Autoriser les entrées / sorties» et «Activer TIP».

Pour activer l'accès DTC réseau 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, Local DTC) pour lequel vous souhaitez activer Network MS DTC Access.

  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 Transaction Manager Communication, cochez les cases Autoriser les entrées et Autoriser les sorties.

Magnus
la source
3
Merci, Magnus. Il doit s'agir d'un paramètre de l'application, car ce type de transaction fonctionnait avec les mêmes ordinateurs, ce qui signifie que ce problème n'est pas lié à la machine.
Lajos Arpad
Oui je l'ai fait. Il lève la même exception.
Lajos Arpad
Je suppose que cela a à voir avec ce que vous faites réellement dans le TransactionScope.
Magnus
De plus, j'ai besoin de la portée de jointure, car je souhaite que cette transaction soit envoyée en une seule demande au serveur de base de données.
Lajos Arpad
13
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
11

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

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

Fondamentalement, 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 Assurez-vous que MSDTC se voit attribuer une valeur CID unique

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 paramètre de démarrage automatique et devait être démarré après la réinstallation.

Tod
la source
9

J'ai eu une procédure de magasin qui appelle une autre procédure de magasin dans "serveur lié" .Lorsque je l'exécute dans ssms, c'était ok, mais quand je l'appelle dans l'application (By Entity Framework), j'ai eu 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 ceci: Serveur lié: Le gestionnaire de transactions partenaire a désactivé sa prise en charge des transactions à distance / réseau

Amirhossein Yari
la source
1
Un lien vers une solution est le bienvenu, mais veuillez vous assurer que votre réponse est utile sans elle: ajoutez du contexte autour du lien pour que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là, puis citez la partie la plus pertinente de la page que vous '' relier au cas où la page cible ne serait pas disponible. Les réponses qui ne sont guère plus qu'un lien peuvent être supprimées.
Petter Friberg
1
Cela a résolu mon problème, alors merci de nous l'avoir fourni. Je ne sais pas pourquoi il a obtenu un vote de -1, car il a permis de corriger mon problème spécifique.
Boyd P
6

Dans mon scénario, l'exception était levé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.
    }
}
Daniel Minnaar
la source
3

Commentaire de la réponse : "assurez-vous d'utiliser la même connexion ouverte pour tous les appels à la base de données à l'intérieur de 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. L'ouverture de la connexion à la base de données pour obtenir l'utilisateur était à l'origine de cette erreur pour moi. Le déplacement de l'autre connexion de base de données et de la recherche utilisateur en dehors de la portée de la transaction a corrigé l'erreur.

Bakanekobrain
la source
1

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

L'opération n'a pas pu être effectuée car le fournisseur OLE DB _ pour le serveur lié _ n'a pas pu commencer une transaction distribuée

Le gestionnaire de transactions partenaire a désactivé sa prise en charge des transactions à distance / réseau *

Passer à SQL Client a résolu mon problème, ce qui m'a également confirmé qu'il s'agissait d'un problème EF.

Tentative basée sur la méthode générée par le 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 la progression.

Je ne pense 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 est atterri ici par Google.

Le code ci-dessus est C #, mais le concept d'essayer de basculer vers Sql Client s'applique toujours. À tout le moins, ce sera un diagnostic d'essayer de le faire.

Greg
la source
Intéressant. Je pense que vous voudrez peut-être modifier la solution avec du code VB (il existe des traducteurs de code disponibles), afin qu'elle corresponde aux balises de la question. Cependant, je l'ai quand même augmenté.
Lajos Arpad
1

Si vous ne trouvez pas DTC local dans les services de composants, essayez d'abord d'exécuter ce script PowerShell:

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

Et ça paraît!

Source: le gestionnaire de transactions partenaire a désactivé sa prise en charge des transactions à distance / réseau

Arthur Cam
la source
0

Au cas où d'autres auraient le même problème:

J'ai eu une erreur similaire. s'est avéré que j'enveloppais plusieurs instructions SQL dans une transaction, où l'une d'entre elles était 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 déclaration dans un try ... catch puis abandonnez la transaction sur la connexion d'origine au cas où le catch serait déclenché.

aggaton
la source
0

J'ai eu le même message d'erreur. Pour moi , le changement pooling=Falseà ;pooling=true;Max Pool Size=200la chaîne de connexion fixe le problème.

Niels Bijl
la source
0

J'avais ce problème avec un serveur lié dans SSMS en essayant de créer une procédure stockée.

Sur le serveur lié, j'ai changé l'option du serveur «Activer la promotion sur la transaction distribuée» en False.

Capture d'écran des options du serveur

Zack Soderquist
la source