Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.tryNo 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);
}
}
}