Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : .NET Framework
.NET
Standard
Microsoft.Data.SqlClient.SqlConfigurableRetryFactory crée des prestataires pour des plannings de réessais courants. La logique de nouvelle tentative configurable est désactivée par défaut. Attribuez un fournisseur à SqlConnection.RetryLogicProvider ou SqlCommand.RetryLogicProvider pour l’activer pour cet objet.
Choisissez un prestataire de réessais.
| Méthode d’usine | Motif de délai |
|---|---|
| SqlConfigurableRetryFactory.CreateFixedRetryProvider | À peu près le même délai avant chaque nouvelle tentative. |
| SqlConfigurableRetryFactory.CreateIncrementalRetryProvider | Cela ajoute DeltaTime au délai après chaque nouvelle tentative. |
| SqlConfigurableRetryFactory.CreateExponentialRetryProvider | Cela augmente le délai de façon exponentielle après chaque réessayage. |
| SqlConfigurableRetryFactory.CreateNoneRetryProvider | Ne réessaie pas. Ce fournisseur est le modèle par défaut. |
Les stratégies fixe, incrémentielle et exponentielle ajoutent une gigue aléatoire à chaque intervalle. La gigue réduit les vagues synchronisées de nouvelles tentatives lorsque de nombreux clients subissent la même interruption de service.
NumberOfTries est le nombre total de tentatives, y compris l’opération initiale. Par exemple, NumberOfTries = 3 permet la première tentative et jusqu’à deux tentatives. Sa plage valide est de 1 à 60.
Liste d’erreurs transitoires intégrée
Lorsque SqlRetryLogicOption.TransientErrors est null, les fournisseurs intégrés réessaient les 20 nombres d’erreur dans SqlConfigurableRetryFactory.BaselineTransientErrors, regroupés selon l’origine de la défaillance :
| Zone de défaillance | Nombres d’erreur |
|---|---|
| Transport du processus de connexion |
233, 997, 10060 |
| Disponibilité de la base de données lors de la connexion |
4060, 4221 |
| Niveau d’instruction |
1204, 1205, 1222 |
| Limite de ressources ou limitation du débit |
10928, 10929, 40501, 49918, 49919, 49920 |
| Basculement du service Azure SQL |
40143, 40197, 40540, 40613 |
| État dédié du pool SQL |
42108, 42109 |
Chaque erreur est décrite dans les sections qui suivent.
Important
Le réglage TransientErrors remplace la liste intégrée. Il ne s’ajoute pas à la liste. Incluez toutes les erreurs que le prestataire devrait réessayer.
Dans Microsoft. Data.SqlClient 7.0 SqlConfigurableRetryFactory.BaselineTransientErrors expose la liste intégrée comme une collection en lecture seule. Utilisez-le pour étendre la base sans copier les numéros d’erreur de la source du pilote :
var transientErrors = SqlConfigurableRetryFactory.BaselineTransientErrors
.Append(12345)
.ToArray();
var options = new SqlRetryLogicOption
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(2),
MaxTimeInterval = TimeSpan.FromSeconds(30),
TransientErrors = transientErrors,
};
Pour les versions antérieures des pilotes, créez une collection appartenant à l’application qui contient les erreurs de base nécessaires ainsi que vos erreurs supplémentaires. Avant de copier une baseline, sélectionnez la balise source SqlClient qui correspond à la version de votre package installé et inspectez SqlConfigurableRetryFactory.cs. La liste de la branche main peut changer après la publication de votre package.
Erreurs lors de l’établissement de la connexion
Les erreurs suivantes sont réessayables dans la liste intégrée ou valent la peine d’être ajoutées TransientErrors en haut de la liste intégrée.
Les erreurs suivantes peuvent être transitoires lorsqu’elles surviennent lors de l’établissement de la connexion ou lors de l’envoi d’une requête au serveur. Réessayez après un court délai (« backoff ») limité. Les erreurs qui persistent après quelques tentatives indiquent généralement un problème de configuration, comme un mauvais serveur, des permissions manquantes, des paramètres de chiffrement incompatibles ou un quota épuisé, que la réévaluation ne corrigera pas.
| Error | Type d’échec | Message | Troubleshooting |
|---|---|---|---|
64 |
Transport lors de la connexion | 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 connexion TCP s'interrompt en cours de négociation. Il ne s'agit pas d'un échec des Informations d’identification. S’il persiste, recherchez l’instabilité du réseau côté client ou un appareil intermédiaire qui supprime les connexions semi-établies. |
233 |
Transport avant connexion ou TLS | The client was unable to establish a connection because of an error during connection initialization process before login. |
Le serveur renvoie souvent cette erreur lorsqu’il ne peut pas accepter la connexion en raison d’une épuisement des ressources, d’une limite de connexion ou d’un client non pris en charge. Il ne s'agit pas d'un échec des Informations d’identification. Vérifiez l’intégrité du serveur, puis vérifiez le délai d’expiration de connexion du client, les paramètres TLS et la compatibilité des versions du client/serveur TLS. |
4060 |
Disponibilité ou accès à la base de données | Cannot open database "%.*ls" requested by the login. The login failed. |
La connexion s’authentifie, mais ne peut pas ouvrir la base de données demandée. Les causes transitoires incluent le fait que la base de données soit en transition (basculement, restauration, mise à l’échelle) ou qu’elle soit en pause automatique. Les causes persistantes (la base de données n’existe pas, la connexion n’a pas accès) ne seront pas corrigées par nouvelle tentative ; vérifiez le nom de la base de données, le mappage de connexion et l’état de la base de données. |
4221 |
Transition secondaire lisible | Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
Le réplica n’est pas disponible pour la connexion, car il manque des versions de ligne pour les transactions qui étaient en cours lorsque le réplica a été recyclé. Annulez ou validez les transactions actives sur le serveur principal pour résoudre le problème. Réduisez en évitant les transactions d’écriture longues sur le serveur principal. |
10053 |
Interruption de transport local | 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.) |
Le côté local abandonne la connexion. Vérifiez l’intégrité du réseau côté client et tout pare-feu local ou client VPN. |
10054 |
Réinitialisation du transport distant | 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.) |
Le côté distant envoie une réinitialisation TCP. Causes courantes : le processus homologue s’est bloqué, un pare-feu a injecté une réinitialisation ou la passerelle Azure SQL a fermé une connexion inactive. Pour les scénarios de réinitialisation après inactivité, activez TCP keepalive côté client ou réduisez le délai d’inactivité du pool de connexions. |
10060 |
Délai d’expiration de la connexion | A connection attempt failed because the connected party did not properly respond after a period of time. |
Le serveur ou un dispositif réseau intermédiaire ne répondait pas avant le délai d’expiration de la connexion TCP. Vérifiez l’état du serveur, le routage, les règles du pare-feu, et si l’hôte et le port configurés sont accessibles. |
10928 |
Limite de ressources de la base de données | Resource ID: %d. The %s limit for the database is %d and has been reached. |
La base de données dépasse une limite de gouvernance des ressources Azure SQL. L’ID de ressource 1 indique la limite de travail ; L’ID de ressource 2 indique la limite de session. Identifiez le type de limite du message, puis réduisez l’accès concurrentiel, augmentez la base de données ou raccourcissez les opérations longues contenant la ressource. |
10929 |
Limitation du débit de la base de données | 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. |
La base de données dépasse sa garantie minimale et le serveur sous-jacent est limité. Une nouvelle tentative réussit généralement lorsque la charge du voisin tombe. Les occurrences soutenues indiquent que vous avez besoin d’un niveau de service supérieur ou d’un environnement moins bruyant. |
40020, 40143, 40166, 40540 |
Sous-code de basculement Azure SQL | Signalé dans l'emplacement Error code %d de l’erreur 40197 lors du basculement. |
Sous-codes intégrés dans un message de basculement 40197 qui, dans certains cas, apparaissent comme le numéro d’erreur principal. Traitez-les comme 40197. |
40197 |
Azure SQL failover | The service has encountered an error processing your request. Please try again. Error code %d. |
Mise à niveau logicielle, défaillance matérielle ou autre événement de basculement dans Azure SQL. La reconnexion vous redirige vers une réplique intègre. Le code d’erreur intégré identifie le type de basculement. Si l’erreur persiste, capturez l’ID de suivi de session et contactez le support technique. |
40501 |
Limitation du débit d’Azure SQL | The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Limitation du débit du moteur SQL Azure. Le minimum recommandé est un délai de temporisation de 10 secondes. Une limitation prolongée indique que la charge de travail a dépassé l’allocation de ressources de la base de données ; augmentez le niveau de service ou réduisez la concurrence. |
40613 |
Base de données non disponible | 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'. |
La base de données n’est pas disponible, en général pendant un basculement ou brièvement lors d’une opération de mise à l’échelle. Réessayez après un backoff ; si le problème persiste au-delà de quelques minutes, relevez l’ID de traçage de la session et ouvrez un ticket d’assistance. |
42108 |
Pool SQL mis en pause | Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
Le pool SQL dédié (Synapse) est dans un état suspendu. Une nouvelle tentative réussit uniquement une fois le pool repris. Reprenez explicitement le pool, ou planifiez la charge de travail pour qu’elle s’exécute une fois le pool repris. |
42109 |
Reprise du pool SQL | The SQL pool is warming up. Please try again. |
Le pool SQL dédié reprend. Réessayez en augmentant progressivement le délai jusqu’à ce que le pool soit en ligne ; la phase de préchauffe prend généralement quelques minutes. |
49918 |
Penurie de ressources de services | Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
Le serveur ne peut actuellement pas allouer suffisamment de ressources pour répondre à la demande. Réessayez après un backoff. Si l’erreur persiste, effectuez un scale-up de la base de données ou du pool élastique. |
49919 |
Limitation des opérations de gestion | Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
Limite de concurrence au niveau de l’abonnement sur les opérations de gestion. Réduisez les appels de création/mise à jour parallèles ou les décaler. |
49920 |
Limitation des opérations d’abonnement | Cannot process request. Too many operations in progress for subscription "%ld". |
Limite de concurrence au niveau de l’abonnement sur les opérations en cours de vol. Réduisez le parallélisme ou attendez que les opérations en cours se terminent. |
Les erreurs au niveau des instructions ne figurent pas dans cette liste, car elles se produisent une fois la connexion établie et l’échec laisse la session utilisable. Les erreurs d’instruction pouvant faire l’objet d’une nouvelle tentative les plus courantes sont 1205 (victime d’interblocage) et 1222 (délai d’expiration de la demande de verrouillage). Relancez l’intégralité de la transaction plutôt que la seule instruction qui échoue.
Le texte du message d’erreur provient de Azure SQL erreurs de connexion temporaires. Ces erreurs peuvent être réessayées sur SQL Server, Azure SQL Database, Azure SQL Managed Instance, base de données SQL dans Microsoft Fabric, ainsi que dans les pools SQL dédiés dans Azure Synapse Analytics.
Erreurs lors de l’exécution des commandes
Les erreurs suivantes surviennent après l’établissement d’une connexion, pendant qu’une commande est en cours. Essayez à nouveau toute la transaction, pas le relevé individuel. La répétition d'une instruction au sein d'une transaction peut entraîner une duplication du travail déjà effectué ou enfreindre les garanties d'ordre de la transaction.
| Error | Type d’échec | Message | Troubleshooting |
|---|---|---|---|
1204 |
Ressource de verrouillage épuisée | 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. |
Le gestionnaire de verrous ne peut pas allouer plus de ressources de verrouillage sur le serveur. Annulez la transaction et réessayez après un court délai. Des occurrences persistantes indiquent une contention ou une pression sur la mémoire auxquelles la mise à l’échelle ou l’optimisation des requêtes doivent remédier. |
1205 |
Victime d’un interblocage | Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. |
Le moteur a choisi cette session pour briser un blocage et a annulé sa transaction. Effectuez un rollback du côté client pour libérer tout état résiduel, puis relancez l’intégralité de la transaction. |
1222 |
Délai d’attente de la demande de verrouillage | Lock request time out period exceeded. |
Le moteur a abandonné en attendant un verrouillage. Réessayez la transaction après un court délai. Les occurrences récurrentes indiquent des problèmes de blocage auxquels l’indexation, l’optimisation des requêtes ou l’examen de SET LOCK_TIMEOUT doivent remédier. |
3960 |
Conflit de mise à jour d’isolation instantanée | 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. |
Deux transactions exécutées sous isolation par instantané ont tenté de mettre à jour la même ligne. Le moteur a annulé cette transaction. Réessayez l’ensemble de la transaction, ou modifiez le niveau d’isolation pour l’opération d’écriture en conflit. Ajoutez à une liste personnalisée d’erreurs transitoires si votre application utilise l’isolation instantanée. |
Les erreurs au niveau de l’instruction qui reflètent un problème de batch ou de schéma (par exemple, 102 des erreurs de syntaxe, 207 une colonne invalide, 2812 une procédure stockée manquante) ne sont pas transitoires. Fixez le texte de requête ou la liaison du schéma ; Réessayer n’aide pas.
Le texte des messages d’erreur provient de la vue catalogue sys.messages . Ces erreurs proviennent du moteur SQL Server, donc leurs chiffres sont les mêmes pour SQL Server, Azure SQL Database, Azure SQL Managed Instance, base de données SQL dans Microsoft Fabric, et les pools SQL dédiés dans Azure Synapse Analytics, quel que soit le pilote.
C’est le pilote, et non le moteur, qui expose des représentations côté client des erreurs de délai d’expiration d’instruction et d’annulation (par exemple, le délai d’expiration Microsoft.Data.SqlClient -2) ; ces erreurs ne figurent donc pas dans la liste prédéfinie. Si votre application détecte ces erreurs séparément, gérez-les à la même frontière de transaction que les erreurs du moteur décrites précédemment.
Comportement des commandes et des transactions
Les fournisseurs intégrés n’effectuent pas de nouvelle tentative lorsqu’une commande s’exécute dans un contexte ambiant TransactionScope ou est associée à un SqlTransaction. La commande s’exécute une fois sans logique de réessayage. Réessayer une seule instruction dans une transaction peut dupliquer un travail antérieur ou violer l’ordre prévu de la transaction.
Avertissement
Pour les blocages et autres échecs réessayables au sein d’une transaction, revenez en arrière et réessayez toute la transaction en une seule unité. Ne réessayez pas seulement la commande qui échoue.
Utilisez-le SqlRetryLogicOption.AuthorizedSqlCondition pour limiter les tentatives de commande aux opérations que votre application peut répéter en toute sécurité. Le prédicat reçoit le texte de la commande. Si le prédicat retourne false, la commande s’exécute une fois sans logique de réessayage.
Exemple
Pour des exemples complets de connexion et de commande, voir :