Estou realmente tendo problemas para rastrear alguns bloqueios que estamos enfrentando.
O status do SPID de bloqueio de root é 'dormindo', o cmd é 'AWAITING COMMAND' e o sqltext
é SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Quando visualizo o relatório Top Transactions by Blocked Transactions Count, a instrução SQL de bloqueio é '--'.
Já realizei um rastreamento no SQL e quando o bloqueio acontece rastreando o SPID de bloqueio de root mas não me levou a lugar nenhum. A última instrução trace é a mesma que a sqltext
anterior SET TRANSACTION ISOLATION LEVEL READ COMMITTED
.
Verifiquei todos os procedimentos armazenados relacionados que posso encontrar para garantir que eles tenham instruções TRY/CATCH BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN (usamos procedimentos armazenados para tudo, para que não haja instruções independentes sendo executadas). Esse problema começou a acontecer nas últimas 24 horas e ninguém está alegando ter feito alterações no sistema.
Solução: um de nossos procedimentos armazenados raramente usados teve um erro com uma inserção (o número de colunas não correspondeu), mas ainda estamos confusos sobre o que exatamente estava acontecendo.
Ao examinar todas as informações de rastreamento, a instrução EXEC para esse procedimento armazenado foi listada às vezes, mas NUNCA imediatamente antes do BLOCK acontecer no SPID de bloqueio. Parecia que ao iniciar o bloqueio, o rastreamento não registrava a execução dele (ou qualquer uma das instruções dentro dele). No entanto, há outras vezes em que o rastreamento registrou sua execução e nenhum bloqueio ocorreu.
O relatório de erro do procedimento armazenado veio de um usuário e consegui encontrar várias instruções EXEC em rastreamentos e executá-las no SSMS. Em nenhum momento, quando eu os executei, tivemos algum bloqueio ou eles travaram. Eles foram executados conforme o esperado (o bloco catch foi acionado e reverteu a transação após o erro). Depois de resolver a correção do procedimento armazenado, não vimos o problema novamente.
A partir dos comentários, acho que você teve um tempo limite de comando do lado do cliente que abortou a consulta SQL. Isso não reverte a transação porque a conexão permanece aberta no SQL Server devido ao pool de conexões.
Então, você precisa usar SET XACT_ABORT ON ou adicionar algum código de reversão do cliente
Consulte o tempo limite de transação do SQL Server para obter todos os detalhes sangrentos
Use most_recent_sql_handle em sys.dm_exec_connections para ver a última instrução que foi executada.
Verifique também se há transações abertas para esse spid
Você já tentou usar o sp_whoisactive de Adam Machanic ? Existe uma opção para obter o comando externo para ver se ele realmente está dentro de um proc. Pode ser que o aplicativo esteja mantendo uma transação aberta em vez de confirmá-la. Tente olhar para DBCC OPENTRAN também.