Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Szczegóły
| Attribute | Wartość |
|---|---|
| Nazwa produktu | SQL Server |
| Identyfikator zdarzenia | 3617 |
| Źródło zdarzenia | MSSQLSERVER |
| Składnik | SQLEngine |
| Nazwa symboliczna | SYS_ATTN |
| Tekst wiadomości |
Explanation
Błąd 3617 jest zgłaszany, gdy zapytanie, które znajduje się w trakcie wykonywania, zostanie anulowane przez aplikację lub przez użytkownika albo połączenie zostanie przerwane. To anulowanie zapytania z aplikacji powoduje wystąpienie zdarzenia Uwagi w a aparatze bazy danych. Zdarzenie uwagi to zdarzenie programu SQL Server, które rejestruje żądanie aplikacji klienckiej w celu zakończenia wykonywania zapytania. Zdarzenie uwagi można śledzić po stronie programu SQL Server przy użyciu zdarzeń rozszerzonych lub klasy zdarzeń uwagi śledzenia SQL. Uwagi pojawiają się wewnętrznie jako błąd 3617.
Uwaga (anulowanie zapytania) jest jednym z najbardziej typowych zdarzeń TDS obsługiwanych przez program SQL Server. Po nadejściu żądania anulowania zapytania bit uwagi jest ustawiony dla sesji/żądania. Ponieważ sesja przetwarza punkty wydajności, uwaga jest odbierana i honorowana. Aby uzyskać więcej informacji na temat uwagi i sposobu ich współdziałania z innymi składnikami, zobacz Zadania, Procesy robocze, Wątki, Harmonogram, Sesje, Połączenia, Żądania ; co to wszystko oznacza?
Akcja użytkownika
Podsumowanie przyczyn:
| Przyczyna | Description |
|---|---|
| Upewnij się, że zapytania są kompletne w oczekiwanym czasie trwania (wartość limitu czasu zapytania jest mniejsza niż skonfigurowana) | Najczęstszą przyczyną zdarzeń uwagi jest to, że zapytania są automatycznie przerywane przez aplikację z powodu przekroczenia wartości limitu czasu zapytania. Jeśli wartość limitu czasu zapytania/polecenia jest ustawiona na 30 sekund, a zapytanie nie zwraca nawet pojedynczego pakietu danych z powrotem do aplikacji klienckiej, to drugie spowoduje anulowanie zapytania. W takich przypadkach najlepszym rozwiązaniem jest zrozumienie, dlaczego zapytanie trwa tak długo i podejmij odpowiednie kroki, aby skrócić czas trwania zapytania. |
| Zwiększanie limitu czasu zapytania lub polecenia | Jeśli ustalisz, że anulowane zapytanie jest uruchomione w przedterminowym czasie trwania punktu odniesienia, ale nadal zostanie osiągnięty limit czasu polecenia, możesz rozważyć zwiększenie wartości limitu czasu w aplikacji bazy danych. |
| Dowiedz się, czy użytkownicy anulowali wykonywanie zapytania ręcznie | W niektórych przypadkach zdarzenie uwagi może zostać zgłoszone po prostu dlatego, że użytkownik anulował zapytanie. W takich przypadkach rozsądne może być ustalenie, czy oczekiwania użytkowników przekraczają rzeczywistą szybkość zapytania i rozwiązać je, dostrajając zapytanie lub dokumentując oczekiwany punkt odniesienia. |
| Sprawdź, czy aplikacja lub system operacyjny nieoczekiwanie przerwał zapytanie lub połączenie albo czy sama aplikacja została zakończona | Zbadaj sytuację, aby zrozumieć, co się dzieje na końcu aplikacji. Badanie dzienników aplikacji lub dzienników systemowych może dostarczyć wskazówek dotyczących możliwej głównej przyczyny. |
Uwaga i transakcje
Często zdarzenia uwagi są zgłaszane, gdy aplikacja osiągnie limit czasu zapytania i anuluje zapytanie. Gdy wystąpi zdarzenie Uwagi, program SQL Server nie automatycznie wycofa otwartych transakcji. Jest to odpowiedzialność aplikacji za wycofanie transakcji i istnieje kilka typowych sposobów obsługi:
Kontrolowanie wycofywania transakcji przez włączenie XACT_ABORT SET podczas nawiązywania połączenia z programem SQL Server. Jeśli aplikacja tego nie zrobi, wynik oddzielonej transakcji.
Częściej aplikacje obsługują wszelkie błędy przy użyciu polecenia
try.. catch... finally.tryW bloku otworzysz transakcję i jeśli wystąpi błąd, wycofaj transakcję w przechwycie lub na koniec zablokuj.
Oto przykład:
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);
}
}
}