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:
- 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 nem mesmo um único pacote de dados de volta ao aplicativo cliente, o ú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.
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);
}
}
}