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. p>
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. P>
Un certain contexte sur la façon dont je vais utiliser les champs de transaction: P>
3 Réponses :
2 choses au sommet de ma tête: p>
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. p>
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. P>
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).
Si vous utilisez SQL Server et check @@ TranCount, il sera 0 même si vous avez une transaction active. P>
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.
Espérons que cela aidera quelqu'un un jour: p>
Si vous avez un transaction de transaction avec plusieurs opérations SQL à l'intérieur, le DTC ne sera pas impliqué fourni p>
I.e. ouvert, faire quelque chose, fermer. ouvrir, faire quelque chose, fermer. p>
maintenant pour le gotcha: Si vous le faites jamais dans votre processus (sur un autre fil) p>
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. P> sqlconnection.clearallpools () code> p>