Fournisseurs de logique de tentative intégrés dans SqlClient

S’applique à : .NET Framework .NET Standard

Télécharger ADO.NET

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 :