MSSQLSERVER_3617

Aplica-se a: SQL Server

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 3617
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico SYS_ATTN
Texto da mensagem

Explicação

O erro 3617 é gerado quando uma consulta que está no meio da execução é cancelada pelo aplicativo ou por um usuário ou a conexão é interrompida. Esse cancelamento de consulta do aplicativo faz com que um evento de atenção ocorra no Mecanismo de Banco de Dados. O evento Attention é um evento do SQL Server que registra a solicitação do aplicativo cliente para encerrar a execução da consulta. Você pode rastrear um evento Attention no lado do SQL Server usando a Classe de Evento Extended Events ou SQL Trace Attention. Eventos Atenção aparecem internamente como o erro 3617.

A atenção (cancelamento de consulta) está entre os principais eventos TDS mais comuns manipulados pelo SQL Server. Quando uma solicitação de cancelamento de consulta chega, o bit de atenção é definido para a sessão/solicitação. À medida que a sessão processa pontos suspensos, a atenção é selecionada e liquidada. Para obter mais informações sobre as atenções e como elas interagem com outros componentes, confira Tarefas, Trabalhos, Threads, Agendador, Sessões, Conexões, Solicitações: o que tudo isso significa?

Ação do usuário

Resumo das causas:

  • Verifique se as consultas foram concluídas dentro da duração esperada (menor que o valor de tempo limite de consulta configurado)
  • Aumente o tempo limite de consulta ou comando
  • Descubra se os usuários cancelaram a execução da consulta manualmente
  • Descubra se o aplicativo ou o sistema operacional foi encerrado inesperadamente

Verifique se as consultas foram concluídas dentro da duração esperada (menor que o valor de tempo limite de consulta configurado): o motivo mais comum para eventos de atenção é que as consultas são encerradas automaticamente pelo aplicativo devido a valores de tempo limite de consulta excedidos. Se um valor de tempo limite de consulta/comando for definido como 30 segundos e a consulta não retornar nenhum pacote de dados para o aplicativo cliente, ele cancelará a consulta. Nesses casos, a melhor abordagem é entender por que a consulta está demorando tanto e tomar as medidas apropriadas para reduzir sua duração.

Aumente o tempo limite de consulta ou comando: se você perceber que a consulta cancelada está sendo executada dentro da duração de linha de base pré-estabelecida, mas o tempo limite de comando ainda for atingido, considere aumentar o valor do tempo limite no aplicativo de banco de dados.

Descubra se os usuários cancelaram a execução da consulta manualmente: em alguns casos, o evento de atenção pode ser gerado simplesmente porque o usuário cancelou a consulta. Nesses casos, pode ser prudente perceber se as expectativas dos usuários excedem a velocidade real da consulta e resolvê-las ajustando a consulta ou documentando a linha de base esperada.

Descubra se o aplicativo ou o sistema operacional encerrou a consulta ou a conexão inesperadamente ou se o próprio aplicativo foi encerrado: investigue a situação para entender o que acontece na extremidade do aplicativo. Examinar os logs do aplicativo ou os logs do sistema pode fornecer pistas sobre a possível causa raiz.

Atenção e transações

Normalmente, os eventos de atenção são gerados quando o aplicativo atinge o tempo limite de consulta e cancela a consulta. Quando ocorre um evento Attention, o SQL Server não reverte automaticamente as transações abertas. É responsabilidade do aplicativo reverter a transação e há algumas opções comuns para lidar com isso:

  • Controle a reversão de transações habilitando SET XACT_ABORT ON ao se conectar ao SQL Server. Se o aplicativo não fizer isso, resultará em uma transação órfã.

  • Mais comumente, os aplicativos lidam com erros usando try.. catch... finally. No bloco de teste, abra a transação e, caso ocorra um erro, reverta a transação no bloco de captura ou no de finalização.

Este é um exemplo:


using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
    SqlTransaction transaction;
    SqlCommand command = connection.CreateCommand();

    connection.Open();
    transaction = connection.BeginTransaction("UpdateTran_Routine1");


    command.Connection = connection;
    command.Transaction = transaction;


    try
    {
        //update one of the tables 
        command.CommandText = "update dl_tab1 set col1 = 987";
        command.ExecuteNonQuery();
        transaction.Commit();
    }

    catch (SqlException ex)
    {
        // Attempt to roll back the transaction.
        try
        {
            transaction.Rollback();
        }
        catch (Exception ex2)
        {
            // This catch block will handle any errors that may have occurred
            // on the server that would cause the rollback to fail, such as
            // a closed connection.
            Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
            Console.WriteLine("  Message: {0}", ex2.Message);
        }
    }
}