Wbudowani dostawcy logiki ponawiania w SqlClient

Dotyczy: .NET Framework .NET Standard

Pobieranie ADO.NET

Microsoft.Data.SqlClient.SqlConfigurableRetryFactory tworzy dostawców dla typowych harmonogramów powtórek. Domyślnie jest wyłączona konfigurowalna logika powtórek. Przypisz dostawcę do SqlConnection.RetryLogicProvider lub SqlCommand.RetryLogicProvider, aby go włączyć dla tego obiektu.

Wybierz dostawcę powtórek

Metoda fabryczna Wzorzec opóźnień
SqlConfigurableRetryFactory.CreateFixedRetryProvider Mniej więcej takie samo opóźnienie przed każdą kolejną próbą.
SqlConfigurableRetryFactory.CreateIncrementalRetryProvider Dodaje DeltaTime do opóźnienia po każdej ponownej próbie.
SqlConfigurableRetryFactory.CreateExponentialRetryProvider Zwiększa opóźnienie wykładniczo po każdej próbie.
SqlConfigurableRetryFactory.CreateNoneRetryProvider Nie próbuje ponownie. Ten dostawca jest domyślny.

Mechanizmy stały, przyrostowy i wykładniczy dodają losowe odchylenie czasowe do każdego odstępu. Jitter zmniejsza synchronizowane serie powtórek, gdy wielu klientów napotyka tę samą awarię.

NumberOfTries to całkowita liczba prób, wliczając początkową operację. Na przykład NumberOfTries = 3 umożliwia wykonanie pierwszej próby i maksymalnie dwóch ponownych prób. Prawidłowy zakres to od 1 do 60.

Wbudowana lista błędów przejściowych

Gdy SqlRetryLogicOption.TransientErrors ma wartość null, wbudowani dostawcy ponawiają próby dla 20 numerów błędów z SqlConfigurableRetryFactory.BaselineTransientErrors, pogrupowanych według miejsca pochodzenia awarii:

Obszar awarii Liczby błędów
Transport procesu logowania 233, 997, 10060
Dostępność bazy danych podczas logowania 4060, 4221
Poziom instrukcji 1204, 1205, 1222
Limit zasobów lub ograniczanie 10928, 10929, 49918, 49919, 40501, 49920
Przełączenie awaryjne usługi Azure SQL 40143, 40197, 40540, 40613
Stan dedykowanej puli SQL 42108, 42109

Każdy błąd opisany jest w kolejnych sekcjach.

Important

Ustawienia TransientErrors zastępują wbudowaną listę. Nie dołącza do listy. Uwzględnij każdy błąd, który dostawca powinien ponownie sprawdzić.

W Microsoft. Data.SqlClient 7.0 SqlConfigurableRetryFactory.BaselineTransientErrors udostępnia wbudowaną listę jako kolekcję tylko do odczytu. Użyj go do rozszerzenia bazy bez kopiowania numerów błędów ze źródła sterownika:

var transientErrors = SqlConfigurableRetryFactory.BaselineTransientErrors
    .Append(12345)
    .ToArray();

var options = new SqlRetryLogicOption
{
    NumberOfTries = 5,
    DeltaTime = TimeSpan.FromSeconds(2),
    MaxTimeInterval = TimeSpan.FromSeconds(30),
    TransientErrors = transientErrors,
};

W przypadku wcześniejszych wersji sterowników stwórz kolekcję należącą do aplikacji, która zawiera potrzebne błędy bazowe oraz dodatkowe błędy. Przed skopiowaniem baseline wybierz tag źródłowy SqlClienta, który odpowiada wersji zainstalowanego pakietu, i sprawdź SqlConfigurableRetryFactory.cs. Lista w gałęzi main może ulec zmianie po wydaniu pakietu.

Błędy podczas nawiązywania połączenia

Poniższe błędy można ponowić na wbudowanej liście lub warto dodać je do TransientErrors oprócz wbudowanej listy.

Poniższe błędy mogą być przejściowe, gdy pojawiają się podczas nawiązywania połączenia lub podczas wysyłania żądania do serwera. Ponów próbę na krótkim, ograniczonym wycofywaniu. Błędy, które utrzymują się po kilku próbach, zwykle wskazują na problem konfiguracyjny, taki jak zły serwer, brakujące uprawnienia, niekompatybilne ustawienia szyfrowania lub wyczerpany limit, którego ponowne próby nie naprawią.

Error Typ błędu Message Troubleshooting
64 Transport podczas logowania A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - The specified network name is no longer available.) Połączenie TCP zostaje przerwane w trakcie negocjacji. To nie jest błąd poświadczenia. Jeśli problem będzie się powtarzał, sprawdź, czy po stronie klienta nie występuje niestabilność sieci lub czy urządzenie pośredniczące nie zrywa połączeń na wpół ustanowionych.
233 Transport przed zalogowaniem lub TLS The client was unable to establish a connection because of an error during connection initialization process before login. Serwer często zwraca ten błąd, gdy nie może zaakceptować połączenia z powodu wyczerpania zasobów, limitu połączenia lub nieobsługiwanego klienta. To nie jest błąd poświadczenia. Sprawdź kondycję serwera, a następnie sprawdź limit czasu logowania klienta, ustawienia protokołu TLS i zgodność wersji protokołu TLS klienta/serwera.
4060 Dostępność lub dostęp do bazy danych Cannot open database "%.*ls" requested by the login. The login failed. Logowanie uwierzytelnia się, ale nie może otworzyć żądanej bazy danych. Przejściowe przyczyny obejmują sytuacje, w których baza danych jest w trakcie zmiany stanu (przełączenie awaryjne, przywracanie, skalowanie) lub została automatycznie wstrzymana. Trwałe przyczyny (baza danych nie istnieje, konto logowania nie ma dostępu) nie zostaną usunięte przez ponowienie próby; sprawdź nazwę bazy danych, mapowanie konta logowania oraz stan bazy danych.
4221 Przejście czytelne-drugorzędne Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. Replika nie jest dostępna do logowania, ponieważ brakuje wersji wierszy dla transakcji, które były w locie podczas recyklingu repliki. Wycofaj lub zatwierdź aktywne transakcje na serwerze podstawowym, aby rozwiązać problem. Ogranicz to ryzyko, unikając długotrwałych transakcji zapisu na serwerze głównym.
10053 Lokalne przerwanie transportu A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine.) Strona lokalna zrywa połączenie. Sprawdź stan sieci po stronie klienta oraz lokalną zaporę lub klienta VPN.
10054 Resetowanie transportu zdalnego A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) Po stronie zdalnej jest wysyłane resetowanie protokołu TCP. Typowe przyczyny: proces równorzędny uległ awarii, zapora wymusiła reset połączenia lub brama Azure SQL zamknęła bezczynne połączenie. W przypadku resetowania połączenia z powodu bezczynności włącz mechanizm TCP keepalive po stronie klienta lub skróć limit czasu bezczynności w puli połączeń.
10060 Przekroczenie limitu czasu połączenia A connection attempt failed because the connected party did not properly respond after a period of time. Serwer lub pośredniczące urządzenie sieciowe nie odpowiedziały przed upływem limitu czasu połączenia TCP. Sprawdź stan serwera, routing, reguły zapory oraz to, czy skonfigurowany host i port są osiągalne.
10928 Limit zasobów bazy danych Resource ID: %d. The %s limit for the database is %d and has been reached. Baza danych przekracza limit nadzoru nad zasobami Azure SQL. Identyfikator zasobu 1 oznacza limit procesów roboczych; identyfikator zasobu 2 oznacza limit sesji. Zidentyfikuj typ limitu na podstawie komunikatu, a następnie zmniejsz współbieżność, zwiększ zasoby bazy danych lub skróć długotrwałe operacje blokujące zasób.
10929 Ograniczanie przepustowości bazy danych Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. Baza danych przekroczyła swoje minimalne gwarantowane zasoby, a serwer bazowy ogranicza jej wydajność. Ponowienie próby zwykle kończy się powodzeniem, gdy obciążenie sąsiada spadnie. Trwałe wystąpienia wskazują, że potrzebujesz wyższej warstwy usług lub mniej hałaśliwego środowiska.
40020, 40143, 40166, 40540 Podkod trybu failover usługi Azure SQL Zgłoszone w Error code %d miejscu błędu 40197 podczas pracy w trybie failover. Podkody osadzone w wiadomości awaryjnej 40197, które pokazują niektóre ścieżki jako najwyższy poziom błędu. Traktuj je tak samo jak 40197.
40197 Azure SQL failover The service has encountered an error processing your request. Please try again. Error code %d. Uaktualnienie oprogramowania, awaria sprzętu lub inne zdarzenie trybu failover w Azure SQL. Ponowne połączenie kieruje do sprawnej repliki. Wbudowany kod błędu identyfikuje typ przełączenia awaryjnego. Jeśli błąd będzie się powtarzać, przechwyć identyfikator śledzenia sesji i skontaktuj się z pomocą techniczną.
40501 Ograniczanie przepustowości w usłudze Azure SQL The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. Ograniczanie silnika Azure SQL Zalecane minimalne opóźnienie wynosi 10 sekund. Długotrwałe ograniczanie przepustowości oznacza, że obciążenie przekroczyło przydział zasobów bazy danych; przejdź na wyższy poziom usługi lub zmniejsz współbieżność.
40613 Baza danych jest niedostępna Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'. Baza danych jest niedostępna, zwykle w połowie trybu failover lub krótko podczas operacji skalowania. Ponów próbę po odczekaniu; jeśli problem będzie się utrzymywał dłużej niż kilka minut, zapisz identyfikator śledzenia sesji i otwórz zgłoszenie do działu pomocy technicznej.
42108 Pula SQL wstrzymana Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. Dedykowana pula SQL (Synapse) jest wstrzymana. Ponowienie próby zakończy się powodzeniem dopiero po wznowieniu puli. Wznów pulę ręcznie lub zaplanuj uruchomienie obciążenia po wznowieniu puli.
42109 Wznowienie puli SQL The SQL pool is warming up. Please try again. Dedykowana pula SQL jest wznawiana. Ponów próbę w przypadku wycofywania, dopóki pula nie będzie w trybie online; rozgrzewka zwykle trwa kilka minut.
49918 Niedobór zasobów usługowych Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. Serwer nie może obecnie przydzielić wystarczającej ilości zasobów, aby spełnić żądanie. Ponów próbę z opóźnieniem. Jeśli błąd będzie się powtarzać, przeprowadź skalowanie w górę bazy danych lub elastycznej puli.
49919 Ograniczanie operacji zarządzania Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". Limit współbieżności na poziomie subskrypcji dla operacji zarządzania. Zmniejszenie równoległych wywołań tworzenia/aktualizacji lub ich rozłożenie.
49920 Ograniczanie operacji subskrypcji Cannot process request. Too many operations in progress for subscription "%ld". Limit współbieżności na poziomie subskrypcji dla operacji w locie. Zmniejsz równoległość lub poczekaj, aż trwające operacje się zakończą.

Błędów na poziomie instrukcji nie ma na tej liście, ponieważ występują po nawiązaniu połączenia, a awaria pozostawia sesję w stanie używalnym. Najczęstsze błędy instrukcji, które można ponowić, to 1205 (ofiara impasu) i 1222 (przekroczenie limitu czasu żądania blokady). Ponów całą transakcję zamiast pojedynczej instrukcji, która nie powiodła się.

Tekst komunikatu o błędzie pochodzi z błędów połączenia przejściowego Azure SQL. Te błędy kwalifikują się do ponownego próbowania w SQL Server, Azure SQL Database, Azure SQL Managed Instance, bazie danych SQL w Microsoft Fabric oraz dedykowanych pulach SQL w Azure Synapse Analytics.

Błędy podczas wykonywania poleceń

Następujące błędy pojawiają się po nawiązaniu połączenia, podczas wykonywania polecenia. Spróbuj ponownie całą transakcję, nie indywidualne wyciągi. Ponowienie jednej instrukcji w transakcji może spowodować powielenie wcześniej wykonanej pracy lub naruszenie gwarancji kolejności wykonywania w transakcji.

Error Typ błędu Message Troubleshooting
1204 Wyczerpano zasoby blokady The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions. Menedżer zamków nie może przydzielić więcej zasobów blokad na serwerze. Wycofaj transakcję i spróbuj ponownie po krótkim czasie. Długotrwałe zdarzenia wskazują na konflikt lub presję pamięci, którą skalowanie lub strojenie zapytań musi rozwiązać.
1205 Ofiara zakleszczenia Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Silnik wybrał tę sesję, by przełamać impas i cofnął transakcję. Wycofaj się po stronie klienta, aby zwolnić wszelki pozostały stan, a następnie ponów całą transakcję.
1222 Limit czasu żądania blokady Lock request time out period exceeded. Silnik przestał czekać na blokadę. Spróbuj ponowić transakcję po krótkim opóźnieniu. Powtarzające się przypadki wskazują na problem z blokowaniem, którym należy się zająć za pomocą indeksowania, dostrajania zapytań lub SET LOCK_TIMEOUT przeglądu.
3960 Konflikt aktualizacji w izolacji migawek Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table '%.*ls' directly or indirectly in database '%.*ls' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement. Dwie transakcje działające w trybie izolacji migawkowej próbowały zaktualizować ten sam wiersz. Silnik przerwał tę transakcję. Spróbuj ponownie całą transakcję lub zmień poziom izolacji dla konfliktowego zapisu. Dodaj do niestandardowej listy błędów przejściowych, jeśli twoja aplikacja korzysta z izolacji migawki.

Błędy na poziomie instrukcji, które odzwierciedlają problem wsadowy lub schematyczny (na przykład 102 błędy składniowe, 207 nieprawidłowa kolumna, 2812 brakująca procedura przechowywana), nie są przejściowe. Popraw tekst zapytania lub wiązanie schematu; Próba ponowna nie pomaga.

Tekst komunikatu o błędzie pochodzi z widoku katalogu sys.messages . Błędy te pochodzą z silnika SQL Server, więc ich liczby są takie same w SQL Server, Azure SQL Database, Azure SQL Managed Instance, bazie danych SQL w Microsoft Fabric oraz dedykowanych pulach SQL w Azure Synapse Analytics, regardless of driver.

Sterownik, a nie silnik, udostępnia po stronie klienta reprezentacje błędów limitu czasu i anulowania (na przykład limit czasu Microsoft.Data.SqlClient -2), więc te błędy nie są uwzględnione na wbudowanej liście. Jeśli twoja aplikacja wykrywa te błędy osobno, obsługuj je na tej samej granicy transakcji, co wcześniej opisane błędy silnika.

Zachowanie poleceń i transakcji

Wbudowani dostawcy pomijają ponawianie, gdy polecenie jest wykonywane wewnątrz otaczającego elementu TransactionScope lub ma dołączony element SqlTransaction. Polecenie jest wykonywane tylko raz, bez mechanizmu ponawiania. Ponowienie wykonania pojedynczej instrukcji w transakcji może spowodować powielenie wcześniej wykonanych operacji lub naruszenie zamierzonej kolejności operacji w transakcji.

Caution

W przypadku martwych bloków i innych powtarzalnych błędów w transakcji, cofnij się i spróbuj ponownie całą transakcję jako jedną jednostkę. Nie ponawiaj tylko polecenia, które zakończyło się niepowodzeniem.

Użyj SqlRetryLogicOption.AuthorizedSqlCondition, aby ograniczyć ponowienia poleceń do operacji, które aplikacja może bezpiecznie ponawiać. Predykat otrzymuje tekst komendy. Jeśli predykat zwraca false, polecenie wykonuje się raz bez logiki ponownej próby.

Example

Pełne przykłady połączeń i poleceń można znaleźć w następujących przypadkach: