Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: .NET Framework
.NET
.NET Standard
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
NumberOfTriesil 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.