6
votes

Common Gotchas lors de l'utilisation de transactionsCope et MS DTC

Je commence juste à travailler avec Utilisation de transactionsCope, je trouve qu'il y a toujours des choses inattendues que je rencontre pour toujours pour déboguer.

Je crains que la liste consolidée de ceux-ci serait formidable pour ces circonstances "une erreur étrange", plus d'élargir notre connaissance de bizarrerie dans la plate-forme.

Un certain contexte sur la façon dont je vais utiliser les champs de transaction:

  • Application Web
  • Serveurs Web multiples, serveurs d'applications et serveurs SQL
  • Les transactions seront principalement des transactions de base de données, mais certaines seront élevées pour écrire à MSMQ.

0 commentaires

3 Réponses :


3
votes

2 choses au sommet de ma tête:

  • Les transactions seront élevées lorsque vous utilisez plusieurs objets de connexion dans la même portée, même si les connexions ont les mêmes connexions (ceci est corrigé dans SQL 2008). En savoir plus dans Ce fil et DBConnectionsCope résoudra ce problème sur SQL 2005
  • Les cas de MSDTC doivent être capables de se voir et doivent avoir la sécurité correctement configurée correctement http://support.microsoft.com/kb/899191 (autoriser entrant et sortant, faire Ne pas nécessiter une authentification mutuelle est généralement le pari le plus sûr). Utilisez DTCPing pour résoudre les problèmes de connexion entre les instances DTC, comme expliqué ici: http://support.microsoft.com/kb / 306843

    Vous voulez que les transactions soient légères autant que possible, DTC introduit beaucoup de frais généraux. Vous souhaitez également que les transactions soient aussi courtes que possible, alors introduisez-les uniquement sur les serveurs d'applications et non sur le serveur Web. Faites le saut sur le réseau entre les serveurs d'applications et la base de données aussi petite que possible et aussi vite que possible, envoyez le trafic de réseau entre les serveurs Web et les serveurs d'applications sur une connexion différente de celle des serveurs d'applications et de la DB, et faites le dernier un niveau de hurlement , raccordement ridiculement court.

    Si vous avez plusieurs serveurs d'applications, vous pouvez envisager d'avoir une seule instance de MSDTC exécutée sur un serveur (par exemple sur la base de données ou sur l'un des serveurs d'applications) et utilisez-le à distance à partir de tous les serveurs d'applications au lieu de chacun de chacun. propre, mais je ne sais pas quels avantages supplémentaires cela a.


4 commentaires

Est-ce vraiment corrigé dans SQL Server 2008? J'utilise SQLS2008 et lorsque j'ouvre une deuxième connexion avec la même chaîne de connexion, la transaction reçoit un guid distribué. Alors ... est-ce juste du côté du client, ou est-ce que cela devient vraiment une transaction distribuée?


Voir MSDN.MicRosoft.com/en-us/Library /ms172070%28vs.90%29.aspx Je ne l'ai pas testé pour moi-même, mais selon les documents, il devrait au moins être un scénario plausible où SQL 2008 se comporte comme ceci. Peut-être modifier vos connexions pour contrôler explicitement la mise en commun pourrait aider.


On dirait que non résolu avec SQL Server 2008, voir la transaction élevée à DTC avec la même chaîne de connexion et la même base de données locale


Si vous ouvrez une seconde connexion avant de fermer le premier, il s'aggravera à la DTC sur SQL Server 2008. Vous devez fermer la première connexion avant d'ouvrir le second si vous souhaitez éviter le DTC (je parle de la connexion avec la même chaîne de connexion).



-2
votes

Si vous utilisez SQL Server et check @@ TranCount, il sera 0 même si vous avez une transaction active.


1 commentaires

Ce ne sera pas zéro; Je viens de le tester. Vous ouvrez probablement votre connexion avant la portée de la transaction, ce qui signifie que votre connexion ne participe pas du tout à la transaction (quelque chose que je viens d'apprendre, voir mon message ici: Stackoverflow.com/questions/ 2884863 / ... ). Ouvrez votre connexion à l'intérieur de la portée de la transaction ou appelez explicitement votre transaction existante dans la portée en appelant connexion.enlistTransaction (transaction.current). Exécuter "SELECT @@ TRANCOUNT" pour voir son non-zéro.



1
votes

Espérons que cela aidera quelqu'un un jour:

Si vous avez un transaction de transaction avec plusieurs opérations SQL à l'intérieur, le DTC ne sera pas impliqué fourni

  1. Vous utilisez une chaîne de connexion identique pour chaque connexion
  2. Les connexions ne sont pas imbriquées.

    I.e. ouvert, faire quelque chose, fermer. ouvrir, faire quelque chose, fermer.

    maintenant pour le gotcha: Si vous le faites jamais dans votre processus (sur un autre fil)

    sqlconnection.clearallpools ()

    Et cela arrive entre vos deux opérations - la DTC sera impliquée immédiatement. Si vous n'avez pas la DTC en cours d'exécution, cela lancera une exception.


0 commentaires