Partilhar via


MSSQLSERVER_3617

Aplica-se a:SQL Server

Detalhes

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

Explanation

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 Attention 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 Extended Events ou SQL Trace Attention Event Class. As atenções aparecem internamente como erro 3617.

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 os processos da sessão rendem pontos, a atenção é captada e honrada. Para obter mais informações sobre atenções e como elas interagem com outros componentes , consulte Tarefas, Trabalhadores, Threads, Agendador, Sessões, Conexões, Solicitações ; o que significa tudo isto?

Ação do usuário

Resumo das causas:

Motivo Description
Garantir que as consultas sejam concluídas dentro da duração esperada (valor de tempo limite de consulta inferior ao configurado) A razão mais comum para eventos de atenção é que as consultas são encerradas automaticamente pelo aplicativo devido a valores de tempo limite de consulta excedentes. 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 ao aplicativo cliente, este 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 da consulta ou do comando Se você estabelecer que a consulta cancelada está sendo executada dentro da duração da linha de base preestabelecida, mas um tempo limite de comando ainda for atingido, considere aumentar o valor de 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 determinar se as expectativas dos utilizadores excedem a velocidade real da consulta e resolvê-las ajustando a consulta ou documentando a linha de base esperada.
Descubra se o aplicativo ou sistema operacional encerrou a consulta ou 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 os logs do aplicativo ou os logs do sistema pode fornecer pistas sobre a possível causa raiz.

Atenção e transações

Geralmente, os eventos de Atenção são gerados quando o aplicativo atinge um 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 maneiras comuns de lidar:

  • Controle a reversão de transações habilitando o 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 quaisquer erros usando try.. catch... finallyo . try No bloco , você abre a transação e, se ocorrer um erro, reverta a transação na captura ou finalmente bloqueie.

Aqui está 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);
        }
    }
}