Compartilhar via


MSSQLSERVER_3617

Aplica-se: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:

Motivo Description
Verifique se as consultas são concluídas dentro da duração esperada (menor que o valor de tempo limite da 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 nem mesmo um único pacote de dados de volta para o aplicativo cliente, este último 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.
Aumentar o tempo limite de consulta ou comando Se você estabelecer que a consulta cancelada está em execução dentro da duração da linha de base pré-estabelecida, mas um tempo limite de comando ainda for atingido, você poderá considerar aumentar o valor de tempo limite no aplicativo de banco de dados.
Descobrir 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 estabelecer 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 no final do aplicativo. Examinar logs de aplicativos ou 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:

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

  • Mais comumente, os aplicativos lidam com erros usando try.. catch... finally. try No bloco, você abre a transação e, se ocorrer um erro, reverta a transação na captura ou, por fim, bloqueie.

Veja 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);
        }
    }
}