Quando executo as duas consultas abaixo,
SELECT
session_id, transaction_id
FROM sys.dm_tran_session_transactions;
E
SELECT
session_id, request_id, at.transaction_id
FROM sys.dm_tran_active_transactions at
JOIN sys.dm_exec_requests r
ON r.transaction_id = at.transaction_id;
Eu li o BOL para 1 e 2 , mas não vejo nenhuma explicação clara de por que a diferença ocorreria.
Eu obtenho resultados diferentes. A primeira consulta não retorna resultados, mas a última retorna transações ativas com IDs de sessão e transação. O request_id
é 0, o que, creio, significa que é a única solicitação feita pela sessão. Alguém poderia me ajudar a entender por que existe uma diferença entre os dois conceitos que perguntei acima?
EDITAR
Acabei de reexecutar as consultas e agora obtenho um resultado para o primeiro DMV que possui um session_id
que não está realmente contido no segundo conjunto de resultados.
Parece que
sys.dm_tran_session_transactions
não inclui transações de confirmação automática:O uso de uma transação explícita retorna resultados:
Os DMVs são visões sobre estruturas internas, e a documentação muitas vezes não é tão abrangente quanto em outras áreas. Parte disso pode ser porque seria inconveniente passar por um ciclo completo de depreciação toda vez que ocorre uma mudança no comportamento do DMV, mas provavelmente é apenas um descuido neste caso. Você pode relatar a deficiência de documentação no Connect.
Adam Machanic encontrou todos os tipos de pequenos comportamentos estranhos com os DMVs enquanto escrevia sua ferramenta sp_WhoIsActive . Se for adequado aos seus propósitos, você pode usá-lo em vez de tentar escrever suas próprias consultas de monitoramento.
sys.dm_tran_session_transactions
é uma visão intermediária que permite juntar os DMV's que são identificados principalmente emsession_id column
-sys.dm_exec*
DMV's com outrossys.dm_tran_*
DMV's. Esta visão dirá se a transação é uma transação do usuáriois_user_transaction
= 1 ou uma transação do sistema comis_user_transaction
= 0.Por outro lado,
sys.dm_tran_active_transactions
- é o DMV que armazenará informações transacionais mostrando status, estado de cada transação - iniciada mas não concluída, tipo, etc na instância do servidor sql. Ele também fornece informações sobre transações distribuídas. Este DMV fornecerá resultados para todos os bancos de dados na instância do servidor e é um instantâneo pontual das transações ativas no momento - os resultados serão alterados sempre que a consulta for executada, pois o estado da transação individual será alterado.Consulte sys.dm_tran_session_transactions e sys.dm_tran_active_transactions para obter listas de colunas e o que cada coluna significa.
Ambos os DMVs são um instantâneo do que está acontecendo no momento exato em que são executados. Portanto, é
altamenteprovável que, em um sistema ocupado, a execuçãopode exibir diferentes conjuntos de resultados.