Konfigurowalna logika ponawiania prób w programie SqlClient

Dotyczy: .NET Framework .NET Standard

Pobieranie ADO.NET

Konfigurowalna logika ponawiania prób (CRL) umożliwia składnikowi Microsoft.Data.SqlClient ponawianie wybranych operacji SqlConnection i SqlCommand po wystąpieniu przejściowych błędów. Wybierasz, które błędy kwalifikują się, ile prób wykonać, jak opóźnienia rosną między próbami i które polecenia można powtarzać.

CRL jest domyślnie wyłączone. Umożliwia się to, przypisując dostawcę do połączenia, polecenia lub obu. Obaj dostawcy są niezależni: przypisanie dostawcy do połączenia nie powoduje przypisania go do poleceń utworzonych na podstawie tego połączenia.

Uwaga / Notatka

CRL jest dostępny w Microsoft. Data.SqlClient 3.0 i nowsze. Wartość domyślna to SqlConfigurableRetryFactory.CreateNoneRetryProvider, co oznacza, że próba nie jest ponawiana.

Ponowienia prób CRL

Scenario Przypisz dostawcę do Typowe awarie
Otwórz połączenie SqlConnection.RetryLogicProvider Przełączanie awaryjne, ograniczanie przepustowości, krótka niedostępność bazy danych oraz błędy transportu podczas nawiązywania połączenia.
Wykonywanie polecenia SqlCommand.RetryLogicProvider Wybrane błędy wyciągów, które można bezpiecznie powtórzyć poza transakcją.

W przypadku wspólnego katalogu błędów połączenia, dla których można ponowić próbę w usługach SQL Server, Azure SQL Database, Azure SQL Managed Instance, bazie danych SQL w Microsoft Fabric oraz dedykowanych pulach SQL w Azure Synapse Analytics, zobacz temat Built-in transient error list.

Wybierz ścieżkę konfiguracji

Zadanie Artykuł
Utwórz i przypisz dostawcę w kodzie Konfiguruj logikę retry w SqlClient
Porównaj dostawców stałych, inkrementalnych, wykładniczych i bez powtórek Wbudowani dostawcy logiki ponawiania w SqlClient
Ustaw domyślne wartości dla całej aplikacji w pliku konfiguracyjnym Konfiguruj logikę ponownych prób w SqlClient za pomocą pliku konfiguracyjnego
Zaimplementuj niestandardowy przedział, predykat błędu lub dostawcę Stwórz niestandardowego dostawcy powtórek dla SqlClient

Projektuj politykę bezpiecznego ponownego próbowania

  • Powtórz tylko niepowodzenia, które prawdopodobnie zostaną usunięte bez zmiany danych aplikacji.
  • Ogranicz ponowne próby zarówno liczbą prób, jak i maksymalnym opóźnieniem. Nieograniczona pętla powtórek może przekształcić awarię w długotrwałe obciążenie.
  • Traktuj NumberOfTries jako łączną liczbę prób, wliczając początkową operację.
  • Dodaj jitter, żeby wielu klientów nie próbowało ponownie jednocześnie. Wbudowani dostawcy automatycznie dodają jitter.
  • Ponów całą transakcję, a nie jedną instrukcję w jej obrębie. Wbudowani dostawcy poleceń nie ponawiają poleceń dla połączenia z aktywną transakcją.
  • Ogranicz powtórki poleceń do operacji idempotentnych lub do operacji chronionych mechanizmem idempotencji na poziomie aplikacji.
  • Zapisz zdarzenie Retrying , aby odróżnić odzyskane awarie przejściowe od utrzymujących się incydentów.

Ogólne wskazówki dotyczące architektury można znaleźć w wzorcu Retry. Aby uzyskać wskazówki dotyczące błędów Azure SQL, zobacz błędy przejściowe.

Limity czasu po stronie klienta i bezserwerowe wznawianie

CRL ponawia próby tylko w przypadku błędów, które sterownik faktycznie otrzymuje. Limit czasu po stronie klienta objawia się jako błąd -2, który nie znajduje się na wbudowanej liście błędów przejściowych, więc wbudowani dostawcy nie ponawiają operacji Open() ani polecenia, dla którego upłynął limit czasu po stronie klienta. ConnectTimeout i CommandTimeout muszą być wystarczająco długie, aby same objąć cały proces.

Ten warunek ma największe znaczenie dla poziomu obliczeń Serverless dla Azure SQL Database z włączonym automatycznym pauzowaniem. Automatycznie wstrzymana baza danych zostaje wznowiona po pierwszym Open(), a wznowienie może potrwać od 30 do 60 sekund lub dłużej. Podnieś ConnectTimeout do co najmniej 60 sekund, gdy cel może automatycznie pauzować. Logika powtórek obsługuje następnie pozostałe przejściowe błędy (na przykład 40613, 40197, i 40501), podczas gdy baza danych jest uruchamiana.