Logica di ripetizione dei tentativi configurabile in SqlClient

Si applica a: .NET Framework .NET .NET Standard

Scarica ADO.NET

La logica di ripetizione configurabile (CRL) consente a Microsoft.Data.SqlClient di ritentare le operazioni SqlConnection e SqlCommand selezionate dopo errori temporanei. Scegli quali errori rientrano, quanti tentativi fare, come aumentano i ritardi tra un tentativo e l'altro e quali comandi sono sicuri da ripetere.

Il CRL è disattivato di default. Lo abiliti assegnando un provider a una connessione, a un comando o a entrambi. I due provider sono indipendenti: assegnare un provider a una connessione non lo applica ai comandi creati da quella connessione.

Nota

CRL è disponibile su Microsoft. Data.SqlClient 3.0 e successive. Il valore predefinito è SqlConfigurableRetryFactory.CreateNoneRetryProvider, che non ritenta.

Tentativi CRL

Scenario Assegna il fornitore a Guasti tipici
Apri una connessione SqlConnection.RetryLogicProvider Failover, limitazione della velocità, breve indisponibilità del database ed errori di trasporto durante la creazione della connessione.
Eseguire un comando SqlCommand.RetryLogicProvider Errori selezionati delle istruzioni che possono essere ripetuti in sicurezza al di fuori di una transazione.

Per il catalogo condiviso degli errori di connessione che possono essere ritentati su SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL in Microsoft Fabric e pool SQL dedicati in Azure Synapse Analytics, vedi Lista errori transitori integrati.

Scegli un percorso di configurazione

Task Article
Crea e assegna un provider tramite codice Configura la logica dei ritenti in SqlClient
Confronta fornitori fissi, incrementali, esponenziali e senza ritenti Provider di logica di ritentazione integrati in SqlClient
Imposta i valori predefiniti a livello applicativo in un file di configurazione Configura la logica di ritenti di SqlClient con un file di configurazione
Implementa un intervallo personalizzato, un predicato di errore o un provider Crea un provider di ritenti personalizzati per SqlClient

Progettare una politica di ritenzione sicura

  • Riprova solo i fallimenti che probabilmente si risolveranno senza cambiare l'input dell'applicazione.
  • Limitare i nuovi tentativi sia in base al numero di tentativi sia al ritardo massimo. Un ciclo illimitato di tentativi può trasformare un disservizio in un carico costante.
  • Considera NumberOfTries il numero totale di tentativi, incluso l'operazione iniziale.
  • Aggiungi jitter in modo che i client non riprovino tutti contemporaneamente. I provider integrati aggiungono automaticamente il jitter.
  • Riprova un'intera transazione, non una singola istruzione al suo interno. I provider di comandi integrati non riprovano i comandi su una connessione con una transazione attiva.
  • Limitare la reiterazione dei comandi alle operazioni idempotenti o a quelle protette da un meccanismo di idempotenza a livello applicativo.
  • Registra l'evento Retrying così da distinguere i guasti transitori recuperati dagli incidenti persistenti.

Per indicazioni generali sull'architettura, vedi il pattern Retry. Per le indicazioni sugli errori di Azure SQL, vedi Errori transitori.

Timeout sul lato client e ripresa serverless

CRL ritenta solo gli errori che il driver riceve effettivamente. Un timeout sul lato client si manifesta come errore -2, che non è nell'elenco predefinito degli errori transitori, quindi i provider predefiniti non ripetono un Open() o un comando che va in timeout sul lato client. ConnectTimeout e CommandTimeout devono essere abbastanza lunghi da coprire l'operazione autonomamente.

Questa condizione è la più importante per il livello di calcolo serverless per database SQL di Azure con auto-pausa abilitata. Un database con sospensione automatica si riattiva al primo Open() e la riattivazione può richiedere da 30 a 60 secondi o più. Alza ConnectTimeout a almeno 60 secondi quando il bersaglio può mettere in pausa automatica. La logica di ritentazione gestisce quindi i restanti fallimenti transitori (ad esempio 40613, 40197, e 40501) mentre il database è online.