108 votes

Impossible de commencer une transaction distribuée

J'essaie d'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs suivantes :

BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions

OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".

Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

Il y a deux erreurs retournées par le fournisseur :

Erreur n° 1 :

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile: 
HelpContext: $00000000
SQLState: 01000
NativeError: 7412

Erreur n°2

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile: 
HelpContext: $00000000
SQLState: 42000
NativeError: 7391

Comment faire pour que Microsoft privilégie la fonctionnalité à la sécurité ?

Ou, au moins, comment puis-je faire en sorte que deux SQL Severs se parlent ?

Questions connexes


Ce que je ont fait n'est pas pertinent, mais je vais quand même le poster.

  1. Assurer Distributed Transaction Coordinator Le service fonctionne sur les deux machines :

    enter image description here

    enter image description here

  2. Désactiver toute la sécurité MSDTC sur les deux machines :

    enter image description here

    enter image description here

  3. Activez les options aléatoires sur le serveur lié :

enter image description here

  1. Maudits et jurés.

  2. Des choses cassées.

  3. Vérifié qu'un SELECT peut utiliser le serveur lié :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. Vérifié que le serveur client peut ping le serveur distant :

         C:\Documents and Settings\avatar>ping asicmstest.contoso.com
    
         Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data:
    
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.40:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
  5. Vérifié que le serveur distant peut communiquer en retour, par son nom, avec le serveur initiateur :

         C:\Documents and Settings\avatar>ping asitestserver.contoso.com
    
         Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data:
    
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.22:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
  6. Vérifié que @@SERVERNAME correspond au nom du serveur sur les deux serveurs :

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       -------------  -------------
       ASITESTSERVER  ASITESTSERVER

    et

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
  7. Screamed

  8. Délivré SET XACT_ABORT ON avant d'émettre ma requête :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
  9. Accordé Everyone Full Control à :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    sur les deux serveurs.

42 votes

C'est bien de voir que tu n'as pas sauté l'étape cruciale du "maudit et juré" !

13 votes

Hey, parfois les gens sont très particuliers pour que tu suives chaque Étape. Je ne voulais pas que quelqu'un dise que je n'avais pas essayé quelque chose.

7 votes

J'adore ce post. Il représente toutes les expériences que j'ai eues avec MSDTC.

1voto

JERRY Points 1059

Si votre serveur de destination se trouve dans un autre nuage ou centre de données, vous devez ajouter l'entrée d'hôte suivante Service MSDTC (serveur de destination) dans votre serveur source.

Essayez celui-ci si le problème n'est pas résolu, après avoir activé les paramètres MSDTC.

1voto

Marck Points 1

Ma dernière aventure avec MSDTC et cette erreur aujourd'hui s'est avérée être un problème de DNS. Vous êtes sur la bonne voie en demandant si les machines sont sur le même domaine, EBarr. Excellente liste pour ce problème, d'ailleurs !

Ma situation : J'avais besoin d'un serveur dans un domaine enfant pour pouvoir exécuter des transactions distribuées contre un serveur dans le domaine parent à travers un pare-feu. J'ai utilisé des serveurs liés assez souvent au cours des années, donc j'avais tous les paramètres habituels dans SQL pour un serveur lié et dans MSDTC que Ian a si bien documenté ci-dessus. J'ai configuré MSDTC avec une série de ports TCP (5000-5200) à utiliser sur les deux serveurs, et j'ai fait en sorte qu'il y ait un trou de pare-feu entre les boîtes pour les ports 1433 et 5000-5200. Cela aurait dû fonctionner. Le serveur lié a été testé correctement et j'ai pu interroger le serveur SQL distant via le serveur lié, mais je n'ai pas pu obtenir qu'il autorise une transaction distribuée. Je pouvais même voir une connexion sur le serveur QA à partir du serveur DEV, mais quelque chose ne faisait pas le voyage de retour.

Je pourrais faire un PING du serveur DEV depuis QA en utilisant un FQDN comme : PING DEVSQL.dev.domain.com

Je n'ai pas pu faire un PING du serveur DEV avec seulement le nom de la machine : PING DEVSQL

Le serveur DEVSQL était censé être membre des deux domaines, mais le nom ne se résolvait pas dans le DNS du domaine parent... quelque chose était arrivé au compte machine de DEVSQL dans le domaine parent. Une fois que nous avons ajouté DEVSQL au DNS du domaine parent et que "PING DEVSQL" a fonctionné depuis le serveur d'assurance qualité distant, ce problème a été résolu.

J'espère que cela vous aidera !

0voto

Trepach Points 33

Outre les paramètres de sécurité, j'ai dû ouvrir certains ports sur les deux serveurs pour que la transaction puisse être exécutée. J'ai dû ouvrir le port 59640 mais selon la suggestion suivante, le port 135 doit être ouvert. http://support.microsoft.com/kb/839279

0voto

Kaawach Said Points 19

J'ai obtenu la même erreur et j'ai réussi à la résoudre en configurant correctement le MSDTC sur le serveur source pour autoriser les sorties et autoriser le DTC à travers le pare-feu Windows.

Autoriser le coordinateur de transactions distribuées, cocher les options de domaine, privé et public.

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