Delen via


MSSQLSERVER_3617

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 het try blok 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);
        }
    }
}