web-dev-qa-db-fra.com

Comment puis-je activer les transactions distribuées pour un serveur lié?

J'ai une instance SQL Server 2012 avec un serveur lié pointant vers une base de données db2 sur un système IBM Iseries à l'aide du System i Access ODBC Driver.

J'essaie d'activer les transactions distribuées. Je crois que ce fournisseur les prend en charge selon documentation IBM (sauf si je comprends mal ce lien).

J'exécute la requête suivante:

BEGIN TRANSACTION
    UPDATE LINKEDSERVER.LINKEDDATABASE.SCHEMANAME.TABLENAME SET COLUMN = VALUE

    SELECT CAST('qwerty' as integer) -- we want an error here so the transaction fails
COMMIT TRANSACTION

J'obtiens l'erreur suivante:

Le fournisseur OLE DB "MSDASQL" pour le serveur lié "LINKEDSERVER" a renvoyé le message "[IBM] [System i Access ODBC Driver] Échec de l'inscription avec la phase DTC. 2". Msg 7391, Niveau 16, État 2, ligne 2 L'opération n'a pas pu être effectuée car OLE fournisseur de base de données "MSDASQL" pour le serveur lié "LINKEDSERVER" n'a pas pu démarrer une transaction distribuée.

Toutes les recherches que j'ai faites sur cette erreur ont rencontré des personnes souhaitant désactiver les transactions distribuées, pas les faire fonctionner. J'ai déjà défini "Activer la promotion des transactions distribuées" sur true dans les propriétés du serveur lié.

Des idées sur la façon dont je peux faire fonctionner cela?

EDIT: Plus d'informations/mise à jour. J'étais sur le point de renoncer à cela pour l'instant et d'attendre de l'aide, quand je l'ai remarqué dans les journaux de Windows:

Un appelant a tenté d'enregistrer une ressource XA alors que les transactions XA sont désactivées.

J'ai trouvé ce lien qui m'a dit comment modifier les paramètres du MSDTC. Après avoir joué avec les paramètres et redémarré mon serveur, les choses ont commencé à fonctionner (en quelque sorte): (spécifiquement, j'ai activé l'accès réseau DTC, autoriser les transactions XA entrantes/sortantes/activer).

enter image description here

À l'heure actuelle, la requête s'exécute et valide/annule comme prévu, mais semble fonctionner une partie du temps, mais une erreur d'autres fois. L'erreur est:

Le fournisseur OLE DB "MSDASQL" pour le serveur lié "LINKEDSERVER" a renvoyé le message "[IBM] [System i Access ODBC Driver] Erreur interne du pilote."

EDIT2: Maintenant, cela ne fonctionne plus du tout. Message d'erreur:

Le fournisseur OLE DB "MSDASQL" pour le serveur lié "LINKEDSERVER" a renvoyé le message "Le pilote ODBC n'a pas pu démarrer une nouvelle transaction.". OLE Le fournisseur de base de données "MSDASQL" pour le serveur lié "LINKEDSERVER" a renvoyé le message "[Microsoft] [ODBC Driver Manager] Opération illégale lors d'une transaction de composant de serveur de transactions").

5
Mansfield

En plus de définir les propriétés DTC locales, vous devez ouvrir le pare-feu sur les deux machines pour permettre au programme Distributed Transaction Coordinator de passer.

Allow Distributed Transaction Coordinator to communicate through Windows Firewall

Lorsque vous testez T-SQL dans la fenêtre de l'éditeur de requête, assurez-vous d'activer XACT_ABORT comme suggéré par Microsoft.

XACT_ABORT doit être défini sur ON pour les instructions de modification de données dans une transaction implicite ou explicite contre la plupart des fournisseurs de bases de données OLE, y compris SQL Server. Le seul cas où cette option n'est pas requise est si le fournisseur prend en charge les transactions imbriquées .

Dans mon cas, pour les propriétés DTC locales, je n'ai besoin que de celles-ci: DTC Settings

5
DVu

Vérifiez que le service DTC et SQL Browser s'exécute sous le bon compte de service.

vérifiez également ces liens MS-BOL suivants pour plus d'aide sur la configuration.

Paramètres MSDTC recommandés pour l'utilisation des transactions distribuées dans SQL Server

vous pouvez utiliser cet outil pour identifier si votre système a une configuration MSDTC appropriée.

2012 Best Practices Analyzer

Enfin et surtout

Comprendre les transactions XA

laissez-nous savoir un exemple de requête que vous essayez.

0
Anup Shah