Impossible de commencer une transaction distribuée

j'essaie D'exécuter SQL sur un serveur lié, mais j'obtiens les erreurs.

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 #1:

Number: 040E14
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: "151910920"000000
SQLState: 01000
NativeError: 7412

erreur #2

Number: 040E14
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: "151920920"000000
SQLState: 42000
NativeError: 7391

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

Ou, à tout le moins, comment puis-je obtenir deux SQL Severs pour se parler?

questions connexes

  • l'opération n'a pas pu être effectuée parce que le fournisseur OLE DB "SQLNCLI10"... (*le nom du serveur lié est (null) )
  • erreur de transaction distribuée? ( utilisation d'Oracle fournisseur )
  • impossible de s'enrôler dans une transaction distribuée avec NHibernate ( en hibernation )
  • Erreur à l'aide de transaction distribuée dans SQL Server 2008 R2 ( SQL Server 2008 R2, pas de réponse )
  • erreur de Transaction distribuée uniquement par le Code ( causée par la mise en commun des connexions )
  • erreur effectuant une transaction distribuée coordinateur sur le serveur ( SQL Server 2008, Pas de réponse )
  • erreur de transaction distribuée? ( pas de réponse; la seule réponse n'aide pas )
  • Comment insérer dans une table distante en utilisant un serveur lié avec une Transaction? ( accepté de réponse ne permet pas de résoudre )

ce que je ai fait n'est pas pertinent, mais je le posterai quand même.

  1. S'assurer Distributed Transaction Coordinator le service fonctionne sur les deux machines:

    enter image description here

    enter image description here

  2. désactiver toute 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. maudit et juré.

  2. cassé des choses.

  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 Settingsavatar>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 recomposer, par nom, le serveur initiateur:

        C:Documents and Settingsavatar>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. CRI

  8. Délivré SET XACT_ABORT ON avant de délivrer ma requête :

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

    HKEY_LOCAL_MACHINESoftwareMicrosoftMSSQLServer
    

    sur les deux serveurs.

84
demandé sur Community 2011-09-19 19:40:08

6 réponses

L'a trouvé, MSDTC sur le serveur distant était un clone du serveur local.

du journal des événements de L'Application Windows:

Type D'Événement: Erreur

Source de l'événement: MSDTC

Catégorie D'événement: CM

Code de l'événement: 4101

Date: 9/19/2011

Temps: 1:32:59

Utilisateur: N/A

Ordinateur: ASITESTSERVER

Description:

le MS DTC local a détecté que le MS DTC sur ASICMSTEST a la même identité unique que le MS local DTC. Cela signifie que les deux MS DTC ne seront pas en mesure de communiquer les uns avec les autres. Ce problème se produit généralement si l'un des systèmes d' ont été clonés à l'aide d'outils de Clonage non supportés. Le DTC exige que la les systèmes doivent être clonés à l'aide d'outils de Clonage pris en charge tels que: SYSPREP. 'Msdtc -désinstaller", puis "installer msdtc-" de la commande invite de résoudre le problème. Note: exécuter 'msdtc-uninstall' va résultat: le système perd toutes les informations de configuration MS DTC.

pour plus d'informations, voir centre D'AIDE et de soutien à http://go.microsoft.com/fwlink/events.asp .

Running

msdtc -uninstall
msdtc -install

et puis s'arrêter et le redémarrage du service de serveur SQL l'a corrigé.

27
répondu Ian Boyd 2015-11-27 15:18:54

OK, donc les services sont lancés, il y a un chemin ethernet entre eux, la résolution des noms fonctionne, les serveurs liés fonctionnent, et vous avez désactivé l'authentification des transactions.

mon instinct dit problème de pare-feu, mais quelques choses viennent à l'esprit...

  1. les machines sont-elles dans le même domaine? (ouais, ne devrait pas désactivé l'authentification)
  2. est-ce que les pare-feu fonctionnent sur les machines? DTC peut être un peu de douleur pour pare-feu comme il utilise une gamme de ports, voir http://support.microsoft.com/kb/306843 pour le moment, je désactiverais les pare-feu pour identifier le problème
  3. que dit DTC ping? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. sous quel compte le service SQL fonctionne-t-il ?
6
répondu EBarr 2011-09-19 18:30:11

si les serveurs sont groupés et qu'il y a un DTC groupé, vous devez désactiver la sécurité sur le DTC groupé et non sur le DTC local.

2
répondu David Wolfinger 2014-10-09 19:15:43

si votre serveur de Destination se trouve sur un autre cloud ou un autre centre de données, vous devez ajouter l'entrée hôte de service MSDTC(serveur de Destination) dans votre serveur source.

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

1
répondu JERRY 2017-04-01 10:26:30

ma dernière aventure avec MSDTC et cette erreur aujourd'hui s'est avérée être un problème DNS. Vous êtes sur la bonne voie en demandant si les machines sont sur le même domaine, EBarr. Liste formidable de ce problème, par la manière dont!

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 via un pare-feu. J'ai utilisé assez de serveurs connectés au fil des années, donc J'ai eu tous les réglages habituels en SQL pour un serveur lié et dans MSDTC que Ian a si bien documenté ci-dessus. J'ai configuré MSDTC avec une gamme de ports TCP (5000-5200) à utiliser sur les deux serveurs, et arrangé un trou de pare-feu entre les boîtes pour les ports 1433 et 5000-5200. Cela aurait travaillé. Le serveur lié a testé OK et je pouvais interroger le serveur SQL distant via le serveur lié correctement, mais je n'ai pas pu l'obtenir pour permettre une transaction distribuée. Je pouvais même voir une connexion sur le serveur QA depuis le serveur DEV, mais quelque chose n'était pas de faire le voyage de retour.

je pourrais pinguer le serveur DEV depuis QA en utilisant un FQDN comme: PING DEVSQL.dev.domain.com

Je ne pouvais PING le serveur DEV avec juste le nom de la machine: ping DEVSQL

le serveur DEVSQL était supposé être un 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 pour le domaine parent, et" PING DEVSQL " a fonctionné à partir du serveur QA distant, ce problème a été résolu pour nous.

j'espère que cela aide!

0
répondu Marck 2013-10-15 08:35:38

mis à part les paramètres de sécurité, j'ai dû ouvrir certains ports sur les deux serveurs pour que la transaction s'exécute. J'ai dû ouvrir le port 59640 mais, selon la suggestion suivante, le port 135 est ouvert. http://support.microsoft.com/kb/839279

0
répondu Trepach 2015-03-10 15:48:28