Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 blokkbantrymegnyitja 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);
}
}
}