Eu tenho um banco de dados muito ocupado e me pediram para procurar transações que revertem.
Usei o SQL Server Profiler para monitorar o TM: Rollback
evento Tran concluído, o que me mostra que dezenas desses eventos estão acontecendo a cada minuto, mas não me dá nenhuma indicação sobre qual transação está sendo revertida, quais objetos são afetados pela reversão , ou por que ocorreu a reversão. Em suma, parece de uso muito limitado.
Se eu tentar também monitorar, por exemplo, SQL:StmtStarting
para dar algum contexto ao rollback, simplesmente haverá muito ruído neste ambiente ocupado para ser capaz de identificar qual instrução é responsável pelo rollback.
Eu também tentei executar a instrução
SELECT *
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
mas isso não retornou nenhum resultado (o que parece estranho, dado o número de reversões relatadas pelo SQL Profiler).
Existe alguma maneira de produzir um relatório mostrando as transações que foram revertidas?
TIA!
Aqui está a maneira pré-Extended Events de fazer isso.
Em vez de usar o Profiler interativamente, use-o para gerar um rastreamento de SQL do lado do servidor que grava em um arquivo. Depois de executar o rastreamento um pouco, você pode consultar os arquivos de rastreamento e/ou carregar os arquivos de rastreamento em uma tabela e consultá-los. Encontre uma sessão que tenha a reversão e, em seguida, consulte todos os eventos dessa sessão, em ordem.
Vou tentar algo aqui que pode não ser a melhor maneira de fazer isso e provavelmente terá um impacto no desempenho do seu servidor, mas ainda assim, acho que é melhor do que nada. No dmv sys.dm_exec_requests, você tem o status da consulta. Quando reverte, mostra "rollback". Se você criar um trabalho que examine constantemente esse DVM e colete o SQL_handle (e mais informações, se necessário) de qualquer solicitação com esse status, esse pode ser um bom ponto de partida.