web-dev-qa-db-fra.com

Pourquoi les transactions fonctionnent-elles comme distribuées (DTCXACT)?

J'essaie effectivement d'analyser et de résoudre des blocages régulièrement survenants qui incluent toutes au moins une transaction nommée "DTCXact", cela me fait demander.

J'exécute de manière répétitive la requête suivante contre les serveurs de production:

SELECT  DTAT.transaction_id ,
    DTAT.[name] ,
    DTAT.transaction_begin_time ,
    CASE DTAT.transaction_type
      WHEN 1 THEN 'Read/write'
      WHEN 2 THEN 'Read-only'
      WHEN 3 THEN 'System'
      WHEN 4 THEN 'Distributed'
    END AS transaction_type ,
    CASE DTAT.transaction_state
      WHEN 0 THEN 'Not fully initialized'
      WHEN 1 THEN 'Initialized, not started'
      WHEN 2 THEN 'Active'
      WHEN 3 THEN 'Ended' -- only applies to read-only transactions
      WHEN 4 THEN 'Commit initiated'-- distributed transactions only
      WHEN 5 THEN 'Prepared, awaiting resolution'
      WHEN 6 THEN 'Committed'
      WHEN 7 THEN 'Rolling back'
      WHEN 8 THEN 'Rolled back'
    END AS transaction_state ,
    CASE DTAT.dtc_state
      WHEN 1 THEN 'Active'
      WHEN 2 THEN 'Prepared'
      WHEN 3 THEN 'Committed'
      WHEN 4 THEN 'Aborted'
      WHEN 5 THEN 'Recovered'
    END AS dtc_state
FROM    sys.dm_tran_active_transactions DTAT
        INNER JOIN sys.dm_tran_session_transactions DTST
                         ON DTAT.transaction_id = DTST.transaction_id
WHERE   [DTST].[is_user_transaction] = 1
ORDER BY DTAT.transaction_begin_time

Il montre toujours des résultats similaires à cet échantillon:

2414848764; DTCXact; 2016-01-28 10: 24: 41.983; Distribué; commis; commis 2414896908; DTCXact; 2016-01-28 10: 26: 05.847; Distribué; commis; engagé 2414903917; DTCXACT; 2016-01-28 10 : 26: 29.017; distribué; commis; engagé 2414918503; user_transaction; 2016-01-28 10: 27: 06.823; lecture/écriture; actif; null 2414918551; DTCXact; 2016-01-28 10: 27: 06.973; distribué; commis; ;Engagé

Ce résultat montre que la plupart des transactions fonctionnent comme distribuées. Je ne sais vraiment pas du tout. Certains des serveurs sont regroupés avec deux nœuds. D'autres ne sont pas. Leurs résultats sont similaires.

faits:

  • Le service MSDTC est en cours d'exécution sur tous les serveurs SQL. Aucun des serveurs SQL n'a de serveurs liés.
  • remote trans proc Dans Sys.Configurations est défini sur 0.
  • Je n'ai trouvé aucun explicite Begin DISTRIBUTED Transaction Ou SET REMOTE_PROC_TRANSACTIONS Utilisation dans le code
  • pas de définition/utilisation de TransactionScope en code
  • Trouvé une classe décrite comme suit: //COM+ Transaction mgr using "Service without Components" model built according to System.Transactions.TransactionScope (NET 2). I don't know what this means.

L'application Web ASP.NET entraînant toujours toujours les transactions et écrit des données d'une même base de données sur un seul et même SQL-Server. Il y a peut-être quelques exceptions près, en particulier lors de la copie nocturne de certaines données, mais je ne m'attendrais pas à voir la majorité des transactions distribuées toute la journée.

J'ai tracé les actios d'une épidémie que j'ai trouvée était en cours d'exécution des transactions distribuées:

Voici un exemple de résultat de la traçage: je vois des dozends de RPC:Completed Evénements d'une rangée suivi de 2 DTCTransaction événements (1st: eventsUndclass = "Enlisting in a DTC transaction", 2e ÉvénementsBlass = " Propagate Transaction "). Tous cigare la même dB. Non TM:Promote Tran xxx Événements se produisent.

J'ai découvert que ces questions fonctionnent sur le IIS (où l'application Web est hébergée) dans un service Windows .NET, qui utilise la même base de données également et exécute les travaux. Puisse cette 2ème application causer DTC ??

J'ai cherché sur le Web sans trouver des questions similaires ni des réponses. Alors je me demande ce qui pourrait être la raison de cela? Ou quelle connaissance dois-je manquer de comprendre cela?

4
Magier

Avez-vous essayé de profiler une seule session pour voir si/lorsque sa transaction est promue à distribuer? Par exemple, en utilisant une trace latérale de serveur à l'aide de par exemple. le DTCTransaction (et peut-être TM: Promote Tran xxx) classes d'événement. Vous pouvez également surveiller le détail Activité DTC dans Windows.

Je profiterais de tous les événements de connexion, d'exécution et de transaction probables liés à une SPID unique, alors qu'il fait un travail représentatif. Remarque: le profilage est le mieux fait sur un système de test en raison des frais généraux, à l'aide d'une trace côté serveur ou des événements étendus équivalents. Ne pas Utilisez l'interface utilisateur du profileur sauf sur une instance de test locale si vous n'avez vraiment aucune autre option.

Si je ne pouvais pas voir le code source de l'application ou parler aux développeurs sur l'utilisation des transactions, il s'agit probablement de la façon dont je commencerais à isoler la cause.

Il peut également être que l'application, sa couche d'accès à des données ou un pilote client est définie pour promouvoir les transactions lorsqu'une deuxième base de données locale est accédée ou une deuxième connexion utilisée dans la même transaction. Il pourrait même y avoir une explicite BEGIN DISTRIBUTED TRANSACTION. Peut-être TransactionScope (ou similaire) est utilisé dans Ado.net avec plusieurs connexions. Voir:

Il existe de nombreuses possibilités, mais le traçage/le profilage vous donnera au moins quelques indices sur les endroits où concentrer vos enquêtes.

Mon hypothèse est que c'est le plus probable d'être un effet secondaire inattendu de la manière dont vos développeurs d'applications utilisent des connexions .NET et des transactions, peut-être combinée avec le Way IIS est configuré.

Il semble probable que les transactions distribuées sont associées à votre classe "transaction mgr" d'une manière ou d'une autre. Il n'y a pas besoin d'être explicite transactionscope Dans votre code, c'est un vecteur commun.

Traversez le code de l'application (et les composants d'accès aux données) Tout en regardant l'effet sur DTC et SQL Server peut être le meilleur moyen de déterminer exactement où, lorsque, et pourquoi les transactions distribuées sont invoquées ou enrôlées.


Obsolète maintenant la question a été modifiée, mais d'autres causes incluent:

  • Serveurs liés avec remote proc transaction promotion définir vrai. Cela peut entraîner une transaction locale à promouvoir une transaction distribuée.

  • Le réglage de la configuration héritée remote trans proc IN SYS.Configurations, lorsqu'il est utilisé avec "serveurs distants". Voir aussi le SET REMOTE_PROC_TRANSACTIONS option de session.

5
Paul White 9

L'application a-t-elle été écrite avant que Mars soutien soit disponible?

Vérifiez combien de connexions votre application s'ouvre dans une seule transaction. Si vous ouvrez plusieurs connexions et les enracinez dans la même transaction, même si les connexions sont à la même base de données, la transaction favorisera à la DTC.

1
pdxrajiv