Compartir a través de


MSSQLSERVER_3617

Se aplica a:SQL Server

Detalles

Attribute Valor
Nombre del 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 de 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 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 administra 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 de usuario

Resumen de las causas:

Causa Description
Asegúrese de que las consultas se completen dentro de la duración esperada (menor que el valor de tiempo de espera de consulta configurado) El motivo más común para los eventos de atención es que la aplicación finaliza automáticamente las consultas debido a la superación de los valores de tiempo de espera de consulta. Si un valor de tiempo de espera de consulta o comando se establece en 30 segundos y la consulta no devuelve incluso un único paquete de datos a la aplicación cliente, este último 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.
Aumento del tiempo de espera de consulta o comando Si establece que la consulta cancelada se ejecuta dentro de la duración de línea base establecida previamente, pero se alcanza un tiempo de espera de comando, puede considerar la posibilidad de aumentar el valor de tiempo de espera en la aplicación de base de datos.
Averiguar si los usuarios cancelaron la ejecución de la consulta manualmente En algunos casos, el evento de atención podría generarse simplemente porque el usuario canceló la consulta. En tales casos, puede ser prudente establecer si las expectativas de los usuarios superan la velocidad real de la consulta y abordarlas mediante la optimización de la consulta o documentando la línea base esperada.
Averigüe si la aplicación o el sistema operativo finalizaron la consulta o la conexión inesperadamente o si la propia aplicación finalizó Investigue la situación para comprender lo que sucede en el extremo de la aplicación. Examinar los registros de aplicaciones o los registros del sistema podrían proporcionar pistas sobre la posible causa principal.

Atención 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 De atención, 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:

  • Controle la reversión de transacciones habilitando SET XACT_ABORT al conectarse a SQL Server. Si una aplicación no lo hace, los resultados de una transacción huérfana.

  • Normalmente, las aplicaciones controlan los errores usando try.. catch... finally. En el try bloque , abra la transacción y, si se produce un error, revierte 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);
        }
    }
}