MSSQLSERVER_3617
Si applica a: SQL Server
Dettagli
Attributo | valore |
---|---|
Nome prodotto | SQL Server |
ID evento | 3617 |
Origine evento | MSSQLSERVER |
Componente | SQLEngine |
Nome simbolico | SYS_ATTN |
Testo del messaggio |
Spiegazione
L'errore 3617 viene generato quando una query che si trova al centro dell'esecuzione viene annullata dall'applicazione o da un utente oppure la connessione viene interrotta. L'annullamento della query dall'applicazione fa sì che si verifichi un evento Attention nel motore di database. L'evento Attention è un evento di SQL Server che registra la richiesta dell'applicazione client per terminare l'esecuzione della query. È possibile tracciare un evento Attention sul lato SQL Server usando la classe di evento Extended Events o SQL Trace Attention. Le attenzione sono visualizzate internamente come errore 3617.
L'attenzione (annullamento delle query) è tra gli eventi TDS più comuni gestiti da SQL Server. Quando arriva una richiesta di annullamento della query, il bit di attenzione viene impostato per la sessione o la richiesta. Man mano che la sessione elabora punti di resa, l'attenzione viene prelevata e rispettata. Per altre informazioni sull'attenzione e su come si interagisce con altri componenti, vedere Attività, Ruoli di lavoro, Thread, Utilità di pianificazione, Sessioni, Connessioni, Richieste. Cosa significa tutto?
Azione utente
Riepilogo delle cause:
- Assicurarsi che le query vengano completate entro la durata prevista (minore del valore di timeout della query configurato)
- Aumentare il timeout della query o del comando
- Verificare se gli utenti hanno annullato manualmente l'esecuzione della query
- Scoprire se l'applicazione o il sistema operativo è terminato in modo imprevisto
Assicurarsi che le query vengano completate entro la durata prevista (minore del valore di timeout delle query configurato): il motivo più comune per cui gli eventi di attenzione sono le query vengono terminate automaticamente dall'applicazione a causa del superamento dei valori di timeout delle query. Se un valore di timeout query/commmand è impostato su 30 secondi e la query non restituisce nemmeno un singolo pacchetto di dati all'applicazione client, quest'ultimo annulla la query. In questi casi, l'approccio migliore consiste nel comprendere il motivo per cui la query richiede molto tempo ed eseguire i passaggi appropriati per ridurne la durata.
Aumentare il timeout della query o del comando: se si stabilisce che la query annullata è in esecuzione entro la durata prevista prestabilita, ma viene ancora raggiunto un timeout del comando, è possibile aumentare il valore di timeout nell'applicazione di database.
Verificare se gli utenti hanno annullato manualmente l'esecuzione della query: in alcuni casi, l'evento di attenzione può essere generato semplicemente perché l'utente ha annullato la query. In questi casi, può essere prudente stabilire se le aspettative degli utenti superano la velocità effettiva della query e risolverle ottimizzando la query o documentando la baseline prevista.
Scoprire se l'applicazione o il sistema operativo ha terminato la query o la connessione in modo imprevisto o se l'applicazione stessa è stata terminata: analizzare la situazione per comprendere cosa accade alla fine dell'applicazione. L'analisi dei log dell'applicazione o dei log di sistema può fornire indicazioni sulla possibile causa radice.
Attenzione e transazioni
In genere, gli eventi di attenzione vengono generati quando l'applicazione raggiunge un timeout della query e annulla la query. Quando si verifica un evento Attention, SQL Server non esegue automaticamente il rollback delle transazioni aperte. È responsabilità dell'applicazione eseguire il rollback della transazione e esistono due modi comuni per gestire:
Controllare il rollback delle transazioni abilitando SET XACT_ABORT ON durante la connessione a SQL Server. Se un'applicazione non esegue questa operazione, viene restituita una transazione orfana.
Più comunemente, le applicazioni gestiscono eventuali errori usando
try.. catch... finally
. Nel blocco try aprire la transazione e, se si verifica un errore, eseguire il rollback della transazione nel blocco catch o finally.
Ecco un esempio:
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);
}
}
}