Sdílet prostřednictvím


MSSQLSERVER_3617

platí pro:SQL Server

Podrobnosti

Vlastnost Hodnota
Název produktu SQL Server
ID události 3617
Zdroj událostí MSSQLSERVER
Součást SQLEngine
Symbolický název SYS_ATTN
Text zprávy

Explanation

Chyba 3617 se vyvolá, když dojde ke zrušení dotazu uprostřed spuštění aplikací nebo uživatelem nebo dojde k přerušení připojení. Zrušení tohoto dotazu z aplikace způsobí, že v databázovém stroji dojde k události Upozornění. Událost Upozornění je událost SQL Serveru, která registruje požadavek klientské aplikace na ukončení provádění dotazů. Událost Upozornění můžete sledovat na SQL Serveru vedle sebe pomocí rozšířené události nebo třídy událostí trasování SQL. Upozornění se interně zobrazují jako chyba 3617.

Pozornost (zrušení dotazu) patří mezi nejčastější událost TDS zpracovávanou SQL Serverem. Když dorazí požadavek na zrušení dotazu, bit pozornosti se nastaví pro relaci nebo požadavek. Vzhledem k tomu, že relace zpracovává body výnosu, je pozornost vybrána a dodržena. Další informace o pozornosti a o tom, jak interplay s jinými komponentami naleznete v tématu Úkoly, Pracovní procesy, Vlákna, Plánovač, Relace, Připojení, Požadavky ; Co to všechno znamená?

Akce uživatele

Shrnutí příčin:

Příčina Description
Zajištění dokončení dotazů během očekávané doby trvání (menší než nakonfigurovaná hodnota časového limitu dotazu) Nejčastějším důvodem událostí pozornosti jsou dotazy, které aplikace ukončí automaticky kvůli překročení hodnot časového limitu dotazu. Pokud je hodnota časového limitu dotazu nebo příkazu nastavená na 30 sekund a dotaz nevrací ani jeden paket dat zpět do klientské aplikace, druhý dotaz zruší. V takových případech je nejlepším přístupem pochopit, proč dotaz trvá tak dlouho, a podniknout vhodné kroky ke snížení doby trvání dotazu.
Prodloužení časového limitu dotazu nebo příkazu Pokud zjistíte, že zrušený dotaz běží v rámci předem stanovené doby trvání směrného plánu, ale stále dochází k vypršení časového limitu příkazu, můžete zvážit zvýšení hodnoty časového limitu v databázové aplikaci.
Zjistěte, jestli uživatelé zrušili provádění dotazu ručně. V některých případech může být událost pozornosti vyvolána jednoduše proto, že uživatel dotaz zrušil. V takových případech může být vhodné stanovit, jestli očekávání uživatelů překročí skutečnou rychlost dotazu a řeší je buď vyladěním dotazu, nebo dokumentováním očekávaného směrného plánu.
Zjistěte, jestli aplikace nebo operační systém dotaz nebo připojení neočekávaně ukončily nebo jestli samotná aplikace skončila. Prozkoumejte situaci, abyste pochopili, co se děje na konci aplikace. Zkoumání protokolů aplikací nebo systémových protokolů může poskytnout vodítka k možné původní příčině.

Pozornost a transakce

Události pozornosti se obvykle vyvolá, když aplikace dosáhne časového limitu dotazu a zruší dotaz. Když dojde k události Pozornost, SQL Server automaticky nevrací otevřené transakce. Za vrácení transakce zodpovídá aplikace a existuje několik běžných způsobů, jak zpracovat:

  • Řízení vrácení transakcí zpět povolením SET XACT_ABORT při připojování k SQL Serveru. Pokud to aplikace neudělá, osamocený výsledek transakce.

  • Častěji aplikace zpracovávají všechny chyby pomocí try.. catch... finally. try V bloku otevřete transakci a pokud dojde k chybě, vrácení transakce zpět v catch nebo nakonec bloku.

Tady je příklad:

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