Partager via


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 de l’application cliente pour arrêter l’exécution de la requête. Vous pouvez tracer un événement Attention côté SQL Server à l’aide des événements étendus ou de la classe d’événements Attention de trace SQL. En interne, un événement Attention prend la forme d’une erreur 3617.

L’attention (annulation de requête) est 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 :

La cause Descriptif
Assurez-vous que les requêtes se terminent dans la durée attendue (valeur de délai d’expiration de requête inférieure à la valeur de délai d’attente de la requête configurée) La raison la plus courante pour les événements d’attention est que les requêtes sont arrêtées automatiquement par l’application en raison du dépassement des valeurs de délai d’attente des requêtes. Si une valeur de délai d’expiration de requête/commande est définie sur 30 secondes et que la requête ne retourne même pas un seul 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 dans une durée de base de référence prédéfinie, mais qu’un délai d’attente de commande est toujours atteint, vous pouvez envisager d’augmenter la valeur de délai d’attente dans l’application de base de données.
Déterminer si les utilisateurs ont annulé l’exécution de la requête manuellement Dans certains cas, l’événement d’attention peut être déclenché simplement parce que l’utilisateur a annulé la requête. Dans ce cas, il peut être prudent d’établir si les attentes des utilisateurs dépassent la vitesse réelle de la requête et répondent à celles-ci en réglant la requête ou en documentant la ligne de base 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 à la fin de l’application. L’examen des journaux d’application 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 lors de la connexion à SQL Server. Si une application ne le fait pas, une transaction orpheline se produit.

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

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