MSSQLSERVER_3617

Se aplica a:SQL Server

Detalles

Atributo Value
Nombre de producto SQL Server
Id. de evento 3617
Origen de eventos MSSQLSERVER
Componente SQLEngine
Nombre simbólico SYS_ATTN
Texto del mensaje

Explicación

Se produce el error 3617 cuando la aplicación o un usuario cancela una consulta que se encuentra en medio de la ejecución, o cuando se rompe la conexión. Esta cancelación de consultas de la aplicación hace que se produzca un evento Attention en el Motor de base de datos. El evento Attention es un evento SQL Server que registra la solicitud de la aplicación cliente para finalizar la ejecución de la consulta. Puede realizar un seguimiento de un evento Attention en el lado SQL Server mediante los eventos extendidos o la clase de eventos de atención de seguimiento de SQL. Los eventos Attention se muestran internamente como el error 3617.

La atención (cancelación de consultas) se encuentra entre los principales eventos TDS más comunes que controla SQL Server. Cuando llega una solicitud de cancelación de consultas, se establece el bit de atención para la sesión o solicitud. A medida que la sesión procesa puntos de rendimiento, el evento Attention se recoge y se respeta. Para obtener más información sobre los eventos Attention y cómo interactúan con otros componentes, vea Tareas, trabajos, subprocesos, programador, sesiones, conexiones, solicitudes; ¿qué significa todo esto?.

Acción del usuario

Resumen de las causas:

  • Garantizar que las consultas se completan dentro de la duración esperada (menor que el valor de tiempo de espera de consulta configurado).
  • Aumentar el tiempo de espera de consulta o comando.
  • Averiguar si los usuarios han cancelado manualmente la ejecución de la consulta.
  • Averiguar si la aplicación o el sistema operativo han finalizado de forma inesperada.

Garantizar que las consultas se completan dentro de la duración esperada (menor que el valor de tiempo de espera de consulta configurado) : la razón más común para que se produzcan los eventos Attention es que la aplicación finaliza automáticamente las consultas debido a que se superan los valores de tiempo de espera de la consulta. Si un valor de tiempo de espera de consulta o comando se establece en 30 segundos, y la consulta no devuelve ni un solo paquete de datos a la aplicación cliente, esta última cancelaría la consulta. En tales casos, el mejor enfoque es comprender por qué la consulta tarda tanto tiempo y tomar los pasos adecuados para reducir su duración.

Aumentar el tiempo de espera de consulta o comando: si establece que la consulta cancelada se ejecuta dentro de la duración de línea de base establecida previamente, pero se sigue alcanzando un tiempo de espera de comando, puede plantearse aumentar el valor de tiempo de espera en la aplicación de base de datos.

Averiguar si los usuarios han cancelado la ejecución de la consulta manualmente: en algunos casos, el evento Attention puede generarse simplemente porque el usuario ha cancelado la consulta. En tales casos, es posible que sea prudente establecer si las expectativas de los usuarios superan la velocidad real de la consulta y abordar esas necesidades ajustando la consulta o documentando la línea de base esperada.

Averiguar si la aplicación o el sistema operativo han finalizado la consulta o la conexión de forma inesperada, o si la propia aplicación ha finalizado: investigue la situación para comprender lo que sucede en el extremo de la aplicación. El examen de los registros de aplicación o los registros del sistema puede proporcionar pistas sobre la posible causa principal.

Attention y transacciones

Normalmente, los eventos Attention se generan cuando la aplicación alcanza un tiempo de espera de consulta y cancela la consulta. Cuando se produce un evento Attention, SQL Server no revierte automáticamente las transacciones abiertas. La aplicación es la responsable de revertir la transacción y existen un par de formas comunes de controlarla:

  • Para controlar la reversión de transacciones, habilite SET XACT_ABORT ON al conectarse a SQL Server. Si una aplicación no lo hace, se produce una transacción huérfana.

  • Normalmente, las aplicaciones controlan los errores usando try.. catch... finally. En el bloque try, debe abrir la transacción y, si se produce un error, revertir la transacción en el bloque catch o finally.

Este es un ejemplo:


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