Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Bijzonderheden
| Attribute | Waarde |
|---|---|
| Productnaam | SQL Server |
| Gebeurtenis-id | 3617 |
| Bron van gebeurtenis | MSSQLSERVER |
| Onderdeel | SQLEngine |
| Symbolische naam | SYS_ATTN |
| Berichttekst |
Explanation
Fout 3617 wordt gegenereerd wanneer een query die zich midden in de uitvoering bevindt, wordt geannuleerd door de toepassing of door een gebruiker, of als de verbinding is verbroken. Deze queryannulering van de toepassing zorgt ervoor dat er een gebeurtenis Aandacht optreedt in de database-engine. De gebeurtenis Aandacht is een SQL Server-gebeurtenis die de aanvraag van de clienttoepassing registreert om de uitvoering van query's te beëindigen. U kunt een gebeurtenis Aandacht op de SQL Server traceren met behulp van de gebeurtenisklasse Uitgebreide gebeurtenissen of SQL Trace Attention Event Class. De aandacht wordt intern weergegeven als fout 3617.
Aandacht (annulering van query's) is een van de meest voorkomende TDS-gebeurtenissen die worden verwerkt door SQL Server. Wanneer een annuleringsaanvraag voor een query binnenkomt, wordt de aandachtsbit ingesteld voor de sessie/aanvraag. Naarmate de sessie processen punten opleveren, wordt de aandacht opgepikt en gehonoreerd. Zie Taken, Workers, Threads, Scheduler, Sessions, Connections, Requests; wat betekent dit allemaal voor meer informatie over aandacht en hoe ze met andere onderdelen samenwerken?
Gebruikersactie
Overzicht van oorzaken:
| Oorzaak | Description |
|---|---|
| Zorg ervoor dat query's zijn voltooid binnen de verwachte duur (minder dan de geconfigureerde time-outwaarde voor query's) | De meest voorkomende reden voor aandachtsgebeurtenissen is dat query's automatisch worden beëindigd door de toepassing vanwege het overschrijden van time-outwaarden voor query's. Als een time-outwaarde voor een query/opdracht is ingesteld op 30 seconden en de query zelfs geen enkel gegevenspakket retourneert naar de clienttoepassing, wordt de query geannuleerd. In dergelijke gevallen is de beste benadering om te begrijpen waarom de query zo lang duurt en de juiste stappen neemt om de duur ervan te verminderen. |
| Time-out voor query's of opdrachten verhogen | Als u vaststelt dat de geannuleerde query wordt uitgevoerd binnen de vooraf vastgestelde basislijnduur, maar er nog steeds een time-out voor de opdracht is bereikt, kunt u overwegen om de time-outwaarde in de databasetoepassing te verhogen. |
| Controleren of gebruikers de uitvoering van de query handmatig hebben geannuleerd | In sommige gevallen kan de aandachtsgebeurtenis worden gegenereerd omdat de gebruiker de query heeft geannuleerd. In dergelijke gevallen kan het verstandig zijn om vast te stellen of de verwachtingen van gebruikers de werkelijke snelheid van de query overschrijden en deze aanpakken door de query af te stemmen of de verwachte basislijn te documenteren. |
| Controleren of de toepassing of het besturingssysteem de query of verbinding onverwacht heeft beëindigd of of de toepassing zelf is beëindigd | Onderzoek de situatie om te begrijpen wat er gebeurt op het einde van de toepassing. Het onderzoeken van toepassingslogboeken of systeemlogboeken kan aanwijzingen geven over mogelijke hoofdoorzaak. |
Aandacht en transacties
Meestal worden er aandachtsevenementen gegenereerd wanneer de toepassing een time-out voor een query bereikt en de query annuleert. Wanneer er een aandachtsgebeurtenis optreedt, worden geopende transacties niet automatisch teruggedraaid in SQL Server. Het is de verantwoordelijkheid van de toepassing om de transactie terug te draaien en er zijn een aantal veelvoorkomende manieren om de transactie af te handelen:
Beheer het terugdraaien van transacties door SET XACT_ABORT in te schakelen bij het maken van verbinding met SQL Server. Als een toepassing dit niet doet, resulteert een zwevende transactie.
Vaker verwerken toepassingen eventuele fouten met behulp van
try.. catch... finally. In hettryblok opent u de transactie en als er een fout optreedt, rolt u de transactie terug in de catch of ten slotte blokkeert.
Hier is een voorbeeld:
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);
}
}
}