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
Microsoft.Data.SqlClient.SqlConfigurableRetryFactory Crea fornitori per i programmi di ritentativi comuni. La logica di ripetizione dei tentativi configurabile è disattivata per impostazione predefinita. Assegna un provider a SqlConnection.RetryLogicProvider o SqlCommand.RetryLogicProvider per abilitarlo per quell'oggetto.
Scegli un fornitore di ritentativi
| Metodo di fabbrica | Schema di ritardo |
|---|---|
| SqlConfigurableRetryFactory.CreateFixedRetryProvider | Circa lo stesso ritardo prima di ogni ritentativo. |
| SqlConfigurableRetryFactory.CreateIncrementalRetryProvider | Aggiunge DeltaTime al ritardo dopo ogni tentativo. |
| SqlConfigurableRetryFactory.CreateExponentialRetryProvider | Aumenta il ritardo esponenzialmente dopo ogni tentativo. |
| SqlConfigurableRetryFactory.CreateNoneRetryProvider | Non riprova. Questo fornitore è il predefinito. |
I fornitori fissi, incrementali ed esponenziali aggiungono jitter casuale a ogni intervallo. Il jitter riduce i picchi sincronizzati di nuovi tentativi quando molti client riscontrano lo stesso disservizio.
NumberOfTries è il numero totale di tentativi, inclusa l'operazione iniziale. Ad esempio, NumberOfTries = 3 permette il primo tentativo e fino a due tentativi. Il suo intervallo valido va da 1 a 60.
Elenco di errori transitori integrato
Quando SqlRetryLogicOption.TransientErrors è null, i provider integrati riprovano i 20 numeri di errore in SqlConfigurableRetryFactory.BaselineTransientErrors, raggruppati per dove ha origine il guasto:
| Area di errore | Numeri di errore |
|---|---|
| Trasporto tramite processo di login |
233, 997, 10060 |
| Disponibilità del database durante il login |
4060, 4221 |
| Livello di istruzione |
1204, 1205, 1222 |
| Limite di risorse o limitazione della velocità |
10928, 10929, 40501, 49918, 49919, 49920 |
| failover del servizio Azure SQL |
40143, 40197, 4054040613 |
| Stato dedicato del pool SQL |
42108, 42109 |
Ogni errore è descritto nelle sezioni successive.
Importante
L'impostazione TransientErrors sostituisce la lista integrata. Non viene aggiunto all'elenco. Includi tutti gli errori che il fornitore deve ritentare.
In Microsoft. Data.SqlClient 7.0, SqlConfigurableRetryFactory.BaselineTransientErrors espone la lista integrata come una collezione di sola lettura. Usalo per estendere la base senza copiare i numeri di errore dalla sorgente del driver:
var transientErrors = SqlConfigurableRetryFactory.BaselineTransientErrors
.Append(12345)
.ToArray();
var options = new SqlRetryLogicOption
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(2),
MaxTimeInterval = TimeSpan.FromSeconds(30),
TransientErrors = transientErrors,
};
Per versioni precedenti dei driver, crea una collezione di proprietà dell'applicazione che contenga gli errori di base necessari e i tuoi errori aggiuntivi. Prima di copiare una baseline, seleziona il tag sorgente SqlClient che corrisponde alla versione installata del pacchetto e ispeziona SqlConfigurableRetryFactory.cs. L'elenco nel ramo main può cambiare dopo il rilascio del tuo pacchetto.
Errori durante l'instaurazione della connessione
I seguenti errori sono quelli per cui è possibile riprovare nell'elenco integrato oppure che vale la pena aggiungere a TransientErrors oltre a quelli dell'elenco integrato.
I seguenti errori possono essere transitori quando si verificano durante l'instaurazione della connessione o durante l'invio di una richiesta al server. Riprova dopo un breve backoff limitato. Gli errori che persistono oltre pochi tentativi di solito indicano un problema di configurazione, come un server sbagliato, permessi mancanti, impostazioni di crittografia incompatibili o quota esaurita, che un ritentativo non risolverà.
| Error | Tipo di errore | Message | Troubleshooting |
|---|---|---|---|
64 |
Trasporto durante l'accesso | 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.) |
La connessione TCP si interrompe durante l'handshake. Non si è verificato un errore di credenziale. Se il problema persiste, controlla la presenza di instabilità della rete lato client o di un dispositivo intermedio che interrompe le connessioni parzialmente stabilite. |
233 |
Trasporto prima dell'accesso o TLS | The client was unable to establish a connection because of an error during connection initialization process before login. |
Il server spesso restituisce questo errore quando non può accettare la connessione a causa dell'esaurimento delle risorse, di un limite di connessione o di un client non supportato. Non si è verificato un errore di credenziale. Verificare l'integrità del server, quindi controllare il timeout di accesso client, le impostazioni TLS e la compatibilità della versione TLS client/server. |
4060 |
Disponibilità o accesso al database | Cannot open database "%.*ls" requested by the login. The login failed. |
L'accesso viene autenticato, ma non può aprire il database richiesto. Le cause temporanee includono il database in fase di transizione (failover, ripristino, ridimensionamento) o sospeso automaticamente. Le cause persistenti (il database non esiste, il login non dispone delle autorizzazioni necessarie) non si risolvono riprovando; verificate il nome del database, il mapping del login e lo stato del database. |
4221 |
Transizione secondaria leggibile | Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
La replica non è disponibile per l'accesso perché mancano versioni delle righe per le transazioni ancora in corso quando la replica è stata reinizializzata. Eseguire il rollback o il commit delle transazioni attive nel database primario per risolvere il problema. Attenuare evitando transazioni di scrittura lunghe nel database primario. |
10053 |
Interruzione del trasporto locale | 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.) |
Il lato locale interrompe la connessione. Controllare lo stato della rete lato client e l'eventuale firewall locale o il client VPN. |
10054 |
Reimpostazione del trasporto remoto | 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.) |
La parte remota invia un reset TCP. Cause comuni: il processo peer si è arrestato in modo anomalo, un firewall ha inserito una reimpostazione o il gateway Azure SQL ha chiuso una connessione inattiva. Per gli schemi di reset dovuti all'inattività, abilitare il keepalive TCP sul client o ridurre il timeout di inattività del pool di connessioni. |
10060 |
Timeout della connessione | A connection attempt failed because the connected party did not properly respond after a period of time. |
Il server o un dispositivo di rete intermedio non rispondevano prima del timeout della connessione TCP. Controlla la salute del server, il routing, le regole del firewall e se l'host configurato e la porta sono raggiungibili. |
10928 |
Limite di risorse del database | Resource ID: %d. The %s limit for the database is %d and has been reached. |
Il database supera un limite di governance delle risorse Azure SQL. L'ID risorsa 1 indica il limite di lavoro; L'ID risorsa 2 indica il limite di sessione. Identificare il tipo di limite dal messaggio, quindi ridurre la concorrenza, aumentare le prestazioni del database o abbreviare le operazioni a esecuzione prolungata che contengono la risorsa. |
10929 |
Limitazione del database | 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. |
Il database sta superando la soglia minima garantita e il server sottostante sta limitando le prestazioni. La ripetizione dei tentativi ha in genere esito positivo quando il carico adiacente scende. Le occorrenze sostenute indicano che è necessario un livello di servizio superiore o un ambiente meno rumoroso. |
40020, 40143, 4016640540 |
Sottocodice di failover di Azure SQL | Segnalato nel slot Error code %d dell'errore 40197 durante il failover. |
I sottocodici contenuti in un messaggio di failover 40197 che alcuni percorsi di codice espongono come codice di errore principale. Trattarli come 40197. |
40197 |
Azure SQL failover | The service has encountered an error processing your request. Please try again. Error code %d. |
Un aggiornamento software, un errore hardware o un altro evento di failover in Azure SQL. La riconnessione ti indirizza a una replica integra. Il codice di errore incorporato identifica il tipo di failover. Se l'errore persiste, acquisire l'ID di traccia della sessione e contattare il supporto tecnico. |
40501 |
Azure SQL throttling | The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Limitazione del motore di Azure SQL Il valore minimo consigliato per il backoff è di 10 secondi. Il throttling prolungato indica che il carico di lavoro ha superato le risorse allocate al database; aumenta il livello di servizio o riduci la concorrenza. |
40613 |
Database non disponibile | 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'. |
Il database non è disponibile, in genere durante un failover o per breve tempo durante un'operazione di scalabilità. Riprovare dopo un intervallo di attesa; se il problema persiste per più di qualche minuto, annotare l'ID di tracciamento della sessione e aprire un caso di supporto. |
42108 |
Pool SQL pausato | Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
Il pool SQL dedicato (Synapse) si trova in uno stato sospeso. Il nuovo tentativo ha esito positivo solo dopo la ripresa del pool. Riprendi esplicitamente il pool oppure pianifica il carico di lavoro affinché venga eseguito dopo che il pool è stato ripreso. |
42109 |
Ripresa del pool SQL | The SQL pool is warming up. Please try again. |
Il pool SQL dedicato riprende. Riprovare su un backoff fino a quando il pool non è online; il riscaldamento richiede in genere alcuni minuti. |
49918 |
Carenza di risorse di servizio | Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
Il server non è attualmente in grado di allocare risorse sufficienti per soddisfare la richiesta. Riprova dopo un intervallo di attesa. Se l'errore persiste, aumentare le prestazioni del database o del pool elastico. |
49919 |
Limitazione delle operazioni di gestione | Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
Limite di concorrenza a livello di sottoscrizione per le operazioni di gestione. Ridurre le chiamate parallele di creazione o aggiornamento oppure scaglionarle. |
49920 |
Limitazione delle operazioni di sottoscrizione | Cannot process request. Too many operations in progress for subscription "%ld". |
Limite di concorrenza a livello di sottoscrizione per le operazioni in corso. Ridurre il parallelismo o attendere che le operazioni in corso vengano completate. |
Gli errori a livello di istruzione non sono inclusi in questo elenco perché vengono attivati dopo la connessione e l'errore lascia utilizzabile la sessione. Gli errori ripetibili delle istruzioni più comuni sono 1205 (vittima di deadlock) e 1222 (timeout della richiesta di blocco). Ritentare l'intera transazione anziché la singola istruzione non riuscita.
Il testo del messaggio di errore proviene da Azure SQL errori di connessione temporanei. Questi errori 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.
Errori durante l'esecuzione del comando
I seguenti errori si verificano dopo l'instaurazione di una connessione, mentre un comando è in esecuzione. Riprova l'intera transazione, non l'estratto conto individuale. Riprovare un'istruzione all'interno di una transazione può duplicare operazioni precedenti o violare le garanzie relative all'ordine di esecuzione della transazione.
| Error | Tipo di errore | Message | Troubleshooting |
|---|---|---|---|
1204 |
Risorsa di blocco esaurita | 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. |
Il gestore di lock non può allocare più risorse di lock sul server. Esegui il rollback della transazione e riprova dopo una breve attesa. Il persistere di tali occorrenze indica una contesa delle risorse o una pressione sulla memoria che devono essere affrontate con il ridimensionamento del sistema o l'ottimizzazione delle query. |
1205 |
Vittima di deadlock | Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. |
Il motore ha scelto questa sessione per rompere un blocco e ha annullato la transazione. Torna indietro dal lato client per rilasciare qualsiasi stato rimanente, poi riprova l'intera transazione. |
1222 |
Timeout per richiesta di blocco | Lock request time out period exceeded. |
Il motore ha rinunciato ad attendere un blocco. Riprova la transazione dopo un breve intervallo di attesa. Occorrenze ricorrenti indicano un problema di blocco che deve essere affrontato tramite l'indicizzazione, l'ottimizzazione delle query o la revisione di SET LOCK_TIMEOUT. |
3960 |
Conflitto di aggiornamento dell'isolamento degli istantanee | 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. |
Due transazioni in esecuzione con isolamento snapshot hanno tentato di aggiornare la stessa riga. Il motore ha annullato questa transazione. Riprova l'intera transazione, oppure cambia il livello di isolamento per la scrittura in conflitto. Aggiungi a una lista personalizzata di errori transitori se la tua applicazione utilizza l'isolamento snapshot. |
Gli errori a livello di istruzione che riflettono un problema batch o di schema (ad esempio, 102 errori di sintassi, 207 colonna non valida, 2812 procedura memorizzata mancante) non sono transitori. Correggere il testo della query o l'associazione allo schema; riprovare non serve.
Il testo del messaggio di errore proviene dalla vista del catalogo sys.messages. Questi errori provengono dal motore SQL Server, quindi i loro numeri sono gli stessi 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, indipendentemente dal driver.
Il driver, non il motore, espone rappresentazioni lato client degli errori di timeout e annullamento delle istruzioni (ad esempio, il timeout di Microsoft.Data.SqlClient -2), quindi questi errori non sono inclusi nell'elenco predefinito. Se la tua applicazione intercetta questi errori separatamente, gestiteli nell'ambito della stessa transazione degli errori del motore descritti in precedenza.
Comportamento di comandi e transazioni
I provider predefiniti non eseguono nuovi tentativi quando un comando viene eseguito all'interno di un TransactionScope esistente o a cui è associato un SqlTransaction. Il comando viene eseguito una volta senza meccanismo di ripetizione. Rieseguire una singola istruzione all'interno di una transazione può duplicare operazioni già eseguite o violare l'ordine previsto della transazione.
Caution
Per blocchi e altri fallimenti riprovabili all'interno di una transazione, torna indietro e riprova l'intera transazione come un'unica unità. Non rieseguire solo il comando che non è riuscito.
Usalo SqlRetryLogicOption.AuthorizedSqlCondition per limitare i tentativi di comando alle operazioni che la tua applicazione può ripetere in sicurezza. Il predicato riceve il testo del comando. Se il predicato restituisce false, il comando viene eseguito una volta senza logica di ritento.
Esempio
Per esempi completi di connessione e comando, vedi: