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 :
- 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 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, celle-ci 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);
}
}
}