Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Details
| attribute | Wert |
|---|---|
| Produktname | SQL Server |
| Ereignis-ID | 3617 |
| Ereignisquelle | MSSQLSERVER |
| Komponente | SQLEngine |
| Symbolischer Name | SYS_ATTN |
| Meldungstext |
Erklärung
Der Fehler 3617 wird ausgelöst, wenn eine Abfrage, die sich gerade in der Ausführung befindet, von der Anwendung oder einem Benutzer abgebrochen wird oder die Verbindung unterbrochen wird. Dieser Abfrageabbruch von der Anwendung bewirkt, dass im Datenbank-Engine ein Attention-Ereignis auftritt. Das Attention-Ereignis ist ein SQL Server-Ereignis, das die Anforderung der Clientanwendung zum Beenden der Abfrageausführung registriert. Sie können ein Attention-Ereignis auf sql Server-Seite nachverfolgen, indem Sie die Ereignisklasse "Extended Events" oder "SQL Trace Attention" verwenden. Attention-Ereignisse werden intern als Fehler 3617 angezeigt.
Aufmerksamkeit (Abfrageabbruch) gehört zu den häufigsten TDS-Ereignissen , die von SQL Server behandelt werden. Wenn eine Abfrageabbruchanforderung eingeht, wird das Attention-Bit für die Sitzung/Anforderung festgelegt. Wenn die Sitzung Zwischenergebnispunkte verarbeitet, wird das Attention-Ereignis übernommen und berücksichtigt. Weitere Informationen zur Attention-Ereignisklassen und dem Zusammenspiel mit anderen Komponenten finden Sie unter Tasks, Worker, Threads, Planer, Sitzungen, Verbindungen, Anforderungen – was bedeuten diese Begriffe?.
Benutzeraktion
Zusammenfassung der Ursachen:
| Ursache | Description |
|---|---|
| Sicherstellen, dass Abfragen innerhalb der erwarteten Dauer abgeschlossen sind (weniger als konfigurierter Abfragetimeoutwert) | Der häufigste Grund für Aufmerksamkeitsereignisse ist, dass Abfragen automatisch von der Anwendung beendet werden, da Abfragetimeoutwerte überschritten werden. Wenn ein Abfrage-/Befehlstimeoutwert auf 30 Sekunden festgelegt ist und die Abfrage nicht einmal ein einzelnes Datenpaket zurück an die Clientanwendung zurückgibt, würde letztere die Abfrage abbrechen. In solchen Fällen sollten Sie herausfinden, weshalb die Abfrage so lange braucht, und geeignete Schritte ergreifen, um die Dauer zu reduzieren. |
| Erhöhen des Abfrage- oder Befehlstimeouts | Wenn Sie festlegen, dass die abgebrochene Abfrage innerhalb der vordefinierten Basisplandauer ausgeführt wird, aber ein Befehlstimeout noch erreicht ist, können Sie in Betracht ziehen, den Timeoutwert in der Datenbankanwendung zu erhöhen. |
| Ermitteln, ob Benutzer die Abfrageausführung manuell abgebrochen haben | In einigen Fällen kann das Aufmerksamkeitsereignis ausgelöst werden, weil der Benutzer die Abfrage abgebrochen hat. In solchen Fällen kann es umsichtig sein, festzustellen, ob die Erwartungen der Benutzer die tatsächliche Geschwindigkeit der Abfrage überschreiten und diese beheben, indem sie die Abfrage optimieren oder den erwarteten Basisplan dokumentieren. |
| Erfahren Sie, ob die Anwendung oder das Betriebssystem die Abfrage oder Verbindung unerwartet beendet hat oder ob die Anwendung selbst beendet wurde. | Untersuchen Sie die Situation, um zu verstehen, was am Anwendungsende passiert. Das Untersuchen von Anwendungsprotokollen oder Systemprotokollen kann Hinweise auf mögliche Ursachen liefern. |
Aufmerksamkeit und Transaktionen
In der Regel werden Attention-Ereignisse ausgelöst, wenn die Anwendung ein Abfragetimeout erreicht und die Abfrage abbricht. Wenn ein Aufmerksamkeitsereignis auftritt, führt SQL Server kein automatisches Rollback für geöffnete Transaktionen durch. Es liegt in der Verantwortung der Anwendung, ein Rollback für die Transaktion durchzuführen, und es gibt einige gängige Methoden für die Verarbeitung:
Steuern Des Transaktionsrollbacks durch Aktivieren von SET XACT_ABORT beim Herstellen einer Verbindung mit SQL Server. Wenn eine Anwendung dies nicht tut, ergibt sich eine verwaiste Transaktion.
In der Regel verarbeiten Anwendungen alle Fehler mithilfe von
try.. catch... finally.tryIm Block öffnen Sie die Transaktion, und wenn ein Fehler auftritt, führen Sie ein Rollback der Transaktion im Catch- oder schließlich-Block durch.
Ein Beispiel:
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);
}
}
}