MSSQLSERVER_3617

Gäller för:SQL Server

Detaljer

Attribute Värde
Produktnamn SQL Server
Händelse-ID 3617
Händelsekälla MSSQLSERVER
Komponent SQLEngine
Symboliskt namn SYS_ATTN
Meddelandetext

Explanation

Fel 3617 utlöses när en fråga som är mitt i körningen avbryts av programmet eller av en användare, eller om anslutningen bryts. Den här frågan avbryts från programmet gör att en Attention-händelse inträffar i databasmotorn. Attention-händelsen är en SQL Server-händelse som registrerar klientprogrammets begäran om att avbryta frågekörningen. Du kan spåra en Attention-händelse på SQL Server-sidan med hjälp av extended events eller SQL Trace Attention Event Class. Uppmärksamhet visas internt som fel 3617.

Uppmärksamhet (frågeavbokning) är en av de vanligaste TDS-händelser som hanteras av SQL Server. När en begäran om frågeavbokning tas emot anges uppmärksamhetsbiten för sessionen/begäran. När sessionen bearbetar avkastningspunkter plockas uppmärksamheten upp och respekteras. Mer information om uppmärksamhet och hur de samverkar med andra komponenter finns i Uppgifter, Arbetare, Trådar, Scheduler, Sessioner, Anslutningar, Begäranden ; vad betyder allt?

Användaråtgärd

Sammanfattning av orsaker:

Orsak Description
Se till att frågorna slutförs inom förväntad varaktighet (mindre än det konfigurerade tidsgränsvärdet för frågor) Den vanligaste orsaken till uppmärksamhetshändelser är att frågor avslutas automatiskt av programmet på grund av överskridna tidsgränsvärden för frågor. Om ett timeout-värde för frågor/kommandon är inställt på 30 sekunder och frågan inte returnerar ens ett enda datapaket tillbaka till klientprogrammet, skulle det senare avbryta frågan. I sådana fall är det bästa sättet att förstå varför frågan tar så lång tid och vidta lämpliga åtgärder för att minska dess varaktighet.
Öka tidsgränsen för frågor eller kommandon Om du fastställer att den avbrutna frågan körs inom en fördefinierad baslinjevaraktighet, men en tidsgräns för kommandot fortfarande nås, kan du överväga att öka tidsgränsvärdet i databasprogrammet.
Ta reda på om användarna avbröt frågekörningen manuellt I vissa fall kan uppmärksamhetshändelsen aktiveras bara för att användaren avbröt frågan. I sådana fall kan det vara klokt att fastställa om användarnas förväntningar överskrider frågans faktiska hastighet och åtgärda dem antingen genom att justera frågan eller dokumentera den förväntade baslinjen.
Ta reda på om programmet eller operativsystemet avslutade frågan eller anslutningen oväntat eller om själva programmet avslutades Undersök situationen för att förstå vad som händer i programslutet. Att undersöka programloggar eller systemloggar kan ge ledtrådar om möjlig rotorsak.

Uppmärksamhet och transaktioner

Uppmärksamhetshändelser aktiveras ofta när programmet når en tidsgräns för frågor och avbryter frågan. När en Attention-händelse inträffar återställer INTE SQL Server automatiskt öppna transaktioner. Det är programmets ansvar att återställa transaktionen och det finns några vanliga sätt att hantera:

  • Kontrollera transaktionsåterställningen genom att aktivera SET XACT_ABORT när du ansluter till SQL Server. Om ett program inte gör detta resulterar en överbliven transaktion.

  • Vanligare är att program hanterar eventuella fel med hjälp try.. catch... finallyav . I blocket try öppnar du transaktionen och om ett fel inträffar återställer du transaktionen i catch- eller slutligen-blocket.

Här är ett exempel:

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