Freigeben über


MSSQLSERVER_3617

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:

  • Sicherstellen, dass Abfragen innerhalb des erwarteten Zeitraums abgeschlossen werden (kleiner als der konfigurierte Abfragetimeoutwert)
  • Erhöhen des Abfrage- oder Befehlstimeouts
  • Ermitteln, ob Benutzer die Abfrageausführung manuell abgebrochen haben
  • Ermitteln, ob die Anwendung oder das Betriebssystem unerwartet beendet wurde

Sicherstellen, dass Abfragen innerhalb des erwarteten Zeitraums abgeschlossen werden (kleiner als der konfigurierte Abfragetimeoutwert): Der häufigste Grund für Attention-Ereignisse ist, dass Abfragen von der Anwendung automatisch beendet werden, weil die Abfragetimeoutwerte überschritten wurden. Wenn ein Abfrage- bzw. Befehlstimeoutwert auf 30 Sekunden festgelegt ist und die Abfrage nicht einmal ein einzelnes Datenpaket 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 feststellen, dass die abgebrochene Abfrage innerhalb der festgelegten Baselinedauer ausgeführt wird, aber ein Befehlstimeout weiterhin erreicht wird, können Sie erwägen, den Timeoutwert in der Datenbankanwendung zu erhöhen.

Ermitteln, ob Benutzer die Abfrageausführung manuell abgebrochen haben: In einigen Fällen kann das Attention-Ereignis einfach ausgelöst werden, weil der Benutzer die Abfrage abgebrochen hat. In solchen Fällen ist es ratsam, festzustellen, ob die Erwartungen der Benutzer die tatsächliche Geschwindigkeit der Abfrage überschreiten, und so entweder die Abfrage zu optimieren oder die erwartete Baseline zu dokumentieren.

Ermitteln, ob die Anwendung oder das Betriebssystem die Abfrage unerwartet beendet haben oder ob die Anwendung selbst beendet wurde: Untersuchen Sie die Situation, um zu verstehen, was am Ende der Anwendung geschieht. Die Untersuchung von Anwendungs- oder Systemprotokollen kann Hinweise zur möglichen Grundursache liefern.

Attention-Ereignis 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 ON beim Herstellen einer Verbindung mit SQL Server. Wenn eine Anwendung diesen Schritt nicht ausführt, ist das Ergebnis eine verwaiste Aktion.

  • In der Regel verarbeiten Anwendungen alle Fehler mithilfe von try.. catch... finally. Im try-Block öffnen Sie die Transaktion und führen ein Rollback für diese im catch- oder finally-Block aus, wenn ein Fehler auftritt:

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