MSSQLSERVER_3617

A következőkre vonatkozik:SQL Server

Részletek

Attribute Érték
Terméknév SQL Server
Eseményazonosító 3617
Eseményforrás MSSQLSERVER
Összetevő SQLEngine
Szimbolikus név SYS_ATTN
Üzenet szövege

Explanation

A 3617-s hiba akkor jelentkezik, ha egy végrehajtás közepén lévő lekérdezést az alkalmazás vagy egy felhasználó megszakít, vagy a kapcsolat megszakad. Ez a lekérdezés az alkalmazásból való törlése miatt figyelem eseményt okoz az adatbázismotorban. A Figyelem esemény egy SQL Server-esemény, amely regisztrálja az ügyfélalkalmazás kérését a lekérdezés végrehajtásának leállítására. A Kiterjesztett események vagy az SQL Trace Attention eseményosztály használatával nyomon követheti a Figyelmet eseményt az SQL Server oldalán. A figyelem belsőleg a 3617-as hibaként jelenik meg.

Az SQL Server által kezelt leggyakoribb TDS-esemény közé tartozik a figyelem (lekérdezéslemondás). Amikor egy lekérdezés-lemondási kérelem érkezik, a rendszer beállítja a figyelmet a munkamenethez/kéréshez. Ahogy a munkamenet-folyamatok pontokat adnak, a rendszer felveszi a figyelmet és tiszteletben tartja a figyelmet. További információ a figyelmükről és arról, hogyan játszanak más összetevőkkel : Feladatok, Feldolgozók, Szálak, Ütemező, Munkamenetek, Kapcsolatok, Kérések ; mit jelent mindez?

Felhasználói művelet

Az okok összefoglalása:

Oka Description
Győződjön meg arról, hogy a lekérdezések a várt időtartamon belül befejeződnek (kevesebb, mint a konfigurált lekérdezés időtúllépési értéke) A figyelemfeltárási események leggyakoribb oka, hogy az alkalmazás automatikusan leállítja a lekérdezéseket a lekérdezés időtúllépési értékeinek túllépése miatt. Ha egy lekérdezés/parancs időtúllépési értéke 30 másodperc, és a lekérdezés egyetlen adatcsomagot sem ad vissza az ügyfélalkalmazásnak, az utóbbi megszakítja a lekérdezést. Ilyen esetekben a legjobb módszer annak megértése, hogy a lekérdezés miért tart ilyen sokáig, és meg kell tenni a megfelelő lépéseket az időtartam csökkentése érdekében.
Lekérdezés vagy parancs időtúllépésének növelése Ha megállapítja, hogy a megszakított lekérdezés az előre meghatározott alapkonfiguráción belül fut, de a parancsok időtúllépése továbbra is fennáll, érdemes lehet növelni az időkorlát értékét az adatbázis-alkalmazásban.
Annak kiderítése, hogy a felhasználók manuálisan megszakították-e a lekérdezés végrehajtását Bizonyos esetekben előfordulhat, hogy a figyelem esemény egyszerűen azért merül fel, mert a felhasználó megszakította a lekérdezést. Ilyen esetekben érdemes lehet megállapítani, hogy a felhasználók elvárásai túllépik-e a lekérdezés tényleges sebességét, és a lekérdezés finomhangolásával vagy a várt alapkonfiguráció dokumentálásával kezelik őket.
Megtudhatja, hogy az alkalmazás vagy operációs rendszer váratlanul leállt-e a lekérdezés vagy a kapcsolat, vagy maga az alkalmazás leállt Vizsgálja meg a helyzetet, hogy megértse, mi történik az alkalmazás végén. Az alkalmazásnaplók vagy a rendszernaplók vizsgálata nyomokat adhat a lehetséges kiváltó okokkal kapcsolatban.

Figyelem és tranzakciók

A figyelem eseményei általában akkor fordulnak elő, amikor az alkalmazás eléri a lekérdezés időtúllépését, és megszakítja a lekérdezést. Figyelem esemény bekövetkezésekor az SQL Server nem hajtja vissza automatikusan a megnyitott tranzakciókat. Az alkalmazás felelőssége, hogy visszaállítsa a tranzakciót, és van néhány gyakori módszer a kezelésre:

  • A tranzakciók visszaállításának szabályozásához engedélyezze a SET XACT_ABORT az SQL Serverhez való csatlakozáskor. Ha egy alkalmazás nem teszi meg ezt, árva tranzakció jön létre.

  • Az alkalmazások általában a használatával kezelik a try.. catch... finallyhibákat. A blokkban try megnyitja a tranzakciót, és hiba esetén visszaállítja a tranzakciót a fogásban vagy végül a blokkban.

Íme egy példa:

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