web-dev-qa-db-fra.com

SQL Server SYS.DM_TRAN_ACELACE_TRANSACTIONS Table de travail de transaction longue en cours d'exécution

aujourd'hui, j'ai utilisé l'objet système sys.dm_tran_active_transactions (pour être honnête pour la première fois). J'ai eu un problème avec des transactions distribuées (Microsoft DTC) et je suis allé la creuser là-bas après que je n'avais aucune idée de l'oputuffut sp_whoisactive uniquement. Ce problème est résolu mais maintenant je vois qu'il existe des transactions assez anciennes dans la table avec le type "Tableau". Voici la sortie pour la requête suivante

SELECT  *,
 case transaction_type   
      when 1 then 'Read/Write'   
      when 2 then 'Read-Only'    
      when 3 then 'System'   
      when 4 then 'Distributed'  
      else 'Unknown - ' + convert(varchar(20), transaction_type)     
 end as tranType,    
 case transaction_state 
      when 0 then 'Uninitialized' 
      when 1 then 'Not Yet Started' 
      when 2 then 'Active' 
      when 3 then 'Ended (Read-Only)' 
      when 4 then 'Committing' 
      when 5 then 'Prepared' 
      when 6 then 'Committed' 
      when 7 then 'Rolling Back' 
      when 8 then 'Rolled Back' 
      else 'Unknown - ' + convert(varchar(20), transaction_state) 
 end as tranState, 
 case dtc_state 
      when 0 then NULL 
      when 1 then 'Active' 
      when 2 then 'Prepared' 
      when 3 then 'Committed' 
      when 4 then 'Aborted' 
      when 5 then 'Recovered' 
      else 'Unknown - ' + convert(varchar(20), dtc_state) 
 end as dtcState
FROM    sys.dm_tran_active_transactions 
ORDER BY transaction_begin_time

enter image description here

Le transaction_begin_time se situe en corrélation avec l'heure du service SQL Server redémarré.

Devrais-je m'inquiéter de quelque manière que ce soit? J'ai consulté - https://www.sqlservergeeks.com/sys-dm_tran_active_transactions/ Pour en savoir plus sur le DMV. Cependant, il mentionne que les tables de travail sont utilisées pour stocker des résultats de requête temporaires dans TEMPDB. Cependant, ma compréhension est que si je démarre une requête dont le plan d'exécution décide de bobine à TEMPDB et d'utiliser une table de travail une nouvelle carte de travail est créée à chaque fois qu'il est nécessaire. Par conséquent, il semble étrange que ça reste 6 tables de travail si anciennes. Je pourrais supprimer que ce sont des tables réutilisées depuis le redémarrage de service pour la surveillance des requêtes qui fonctionnent constamment ou interne SQL Server. Quoi qu'il en soit, le type de transaction ne semble que semble être inoffensif et j'ai remarqué aucun signe de croissance du blocage ou de la version de la version.

Merci d'avance pour votre aide

Martin

1
Martin Guth

Je vois la même chose sur mon 2016 instance - exactement 6 transactions de table de travail, qui ont commencé à seulement quelques secondes après le démarrage du serveur. Si je me joins à sys.dm_tran_database_transactions, Je peux voir que ces transactions existent dans tempdb (base de données_id = 2), comme on peut s'attendre à ce que l'on puisse s'attendre aux tables de travail:

SELECT 
    dtat.transaction_id,
    dtat.[name],
    dtat.transaction_begin_time,
    dtdt.database_id
FROM sys.dm_tran_active_transactions dtat
    INNER JOIN sys.dm_tran_database_transactions dtdt
        ON dtat.transaction_id = dtdt.transaction_id;

screenshot of query results showing worktable transaction starting at 04:41:04

Cela affirme également assez étroitement avec les messages du journal indiquant que Tempdb a été effacé et démarré en cours de démarrage:

screenshot of error log messages showing tempdb starting up at 04:41:03

Je ne trouve aucun moyen à travers les DMV de relier ces "transactions" à une session particulière, mais je pense qu'il est prudent de dire qu'ils sont un processus système et non quelque chose à craindre.


Depuis que vous avez mentionné que vous n'avez pas vu cela dans sp_WhoIsActive, il convient de souligner que la session système est filtrée par défaut de ces procédures. Vous pouvez les voir en passant un paramètre supplémentaire:

EXEC sp_WhoIsActive @show_system_spids = 1;
2
Josh Darnell