MSSQLSERVER_3617

S’applique à :SQL Server

Détails

Attribut Valeur
Nom du produit SQL Server
ID de l’événement 3 617
Source de l’événement MSSQLSERVER
Composant SQLEngine
Nom symbolique SYS_ATTN
Texte du message

Explication

L’erreur 3617 est générée quand une requête en cours d’exécution est annulée par l’application ou un utilisateur, ou quand la connexion est interrompue. Cette annulation de requête par l’application provoque un événement Attention dans le moteur de base de données. L’événement Attention est un événement SQL Server qui inscrit la demande d’arrêt de l’exécution de la requête de l’application cliente. Vous pouvez tracer un événement Attention côté SQL Server à l’aide de la classe d’événements étendus ou de la classe d’événements d’attention de trace SQL. En interne, un événement Attention prend la forme d’une erreur 3617.

L’attention (annulation de requête) figure parmi les événements TDS les plus courants gérés par SQL Server. Quand une demande d’annulation de requête arrive, le bit Attention est défini pour la session/demande. À mesure que la session traite les points de suspension, l’événement Attention est récupéré et honoré. Pour plus d’informations sur les événements Attention et leur interaction avec d’autres composants, consultez Tasks, Workers, Threads, Scheduler, Sessions, Connections, Requests ; what does it all mean?

Action de l'utilisateur

Résumé des causes :

  • Vérifier que les requêtes se terminent dans la durée attendue (avant le dépassement du délai d’expiration configuré pour les requêtes)
  • Augmenter le délai d’expiration de la requête ou de la commande
  • Déterminer si un ou plusieurs utilisateurs ont annulé l’exécution de la requête manuellement
  • Déterminer si l’application ou le système d’exploitation s’est arrêté de manière inattendue

Vérifier que les requêtes se terminent dans la durée attendue (avant le dépassement du délai d’expiration configuré pour les requêtes) : le plus souvent, les événements Attention sont générés à la suite de requêtes arrêtées automatiquement par l’application en raison d’un dépassement du délai d’expiration des requêtes. Si le délai d’expiration d’une requête/commande est défini sur 30 secondes et que la requête ne retourne aucun paquet de données à l’application cliente, cette dernière annule la requête. Dans ce cas, la meilleure approche consiste à comprendre pourquoi la requête est si longue et à prendre les mesures appropriées pour réduire sa durée.

Augmenter le délai d’expiration de la requête ou de la commande : si vous établissez que la requête annulée s’exécute pendant une durée de référence préétablie, mais qu’un dépassement du délai d’expiration de la commande se produit toujours, vous pouvez envisager d’augmenter ce délai dans l’application de base de données.

Déterminer si un ou plusieurs utilisateurs ont annulé l’exécution de la requête manuellement : dans certains cas, l’événement Attention peut être déclenché simplement parce que l’utilisateur a annulé la requête. Dans de tels cas, il peut être prudent de déterminer si les attentes des utilisateurs dépassent la vitesse réelle de la requête et d’y répondre en ajustant la requête ou en documentant la base de référence attendue.

Déterminer si l’application ou le système d’exploitation a arrêté la requête ou la connexion de manière inattendue ou si l’application elle-même s’est arrêtée : examinez la situation pour comprendre ce qui se passe côté application. L’examen des journaux des applications ou des journaux système peut fournir des indices sur la cause racine possible.

Attention et transactions

En règle générale, les événements Attention sont déclenchés quand le délai d’expiration d’une requête est dépassé dans une application et que celle-ci annule la requête. Lorsqu’un événement Attention se produit, SQL Server ne restaure pas automatiquement les transactions ouvertes. Il appartient à l’application de restaurer la transaction, ce qu’elle peut faire de plusieurs façons :

  • Contrôlez la restauration des transactions en activant SET XACT_ABORT ON lors de la connexion à SQL Server. Si une application n’effectue pas cette opération, une transaction orpheline est générée.

  • Plus généralement, les applications gèrent les erreurs avec try.. catch... finally. Dans le bloc try, ouvrez la transaction et, si une erreur se produit, restaurez la transaction dans le bloc catch ou finally.

Voici un exemple :


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