Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: .NET Framework
.NET
Standard
Microsoft.Data.SqlClient.SqlConfigurableRetryFactory crea proveedores para programas de reintentos comunes. La lógica de reintentos configurable está desactivada por defecto. Asigna un proveedor a SqlConnection.RetryLogicProvider o SqlCommand.RetryLogicProvider para habilitarlo para ese objeto.
Elige un proveedor de reintentos
| Método de fábrica | Patrón de retardo |
|---|---|
| SqlConfigurableRetryFactory.CreateFixedRetryProvider | Aproximadamente el mismo retraso antes de cada reintento. |
| SqlConfigurableRetryFactory.CreateIncrementalRetryProvider | Añade DeltaTime al retraso después de cada reintento. |
| SqlConfigurableRetryFactory.CreateExponentialRetryProvider | Aumenta el retardo exponencialmente después de cada intento. |
| SqlConfigurableRetryFactory.CreateNoneRetryProvider | No lo intenta de nuevo. Este proveedor es el predeterminado. |
Los proveedores fijos, incrementales y exponenciales añaden fluctuación aleatoria a cada intervalo. La fluctuación reduce las ráfagas de reintentos sincronizadas cuando muchos clientes se enfrentan a la misma interrupción del servicio.
NumberOfTries es el número total de intentos, incluyendo la operación inicial. Por ejemplo, NumberOfTries = 3 permite el primer intento y hasta dos intentos. Su rango válido es del 1 al 60.
Lista de errores transitorios incorporada
Cuando SqlRetryLogicOption.TransientErrors es null, los proveedores integrados vuelven a intentar los 20 números de error en SqlConfigurableRetryFactory.BaselineTransientErrors, agrupados según el origen del fallo:
| Área de error | Números de error |
|---|---|
| Transporte del proceso de inicio de sesión |
233, 997, 10060 |
| Disponibilidad de la base de datos durante el inicio de sesión |
4060, 4221 |
| Nivel de instrucción |
1204, 1205, 1222 |
| Límite de recursos o limitación de velocidad |
10928, 10929, 40501, 49918, 49919, 49920 |
| Conmutación por error del servicio Azure SQL |
40143, 40197, , 40540, 40613 |
| Estado del grupo de SQL dedicado |
42108, 42109 |
Cada error se describe en las secciones siguientes.
Importante
La configuración TransientErrors reemplaza la lista incorporada. No se añade a la lista. Incluye todos los errores que el proveedor debería volver a intentar.
En Microsoft.Data.SqlClient 7.0, SqlConfigurableRetryFactory.BaselineTransientErrors expone la lista integrada como una colección de solo lectura. Úsalo para extender la línea base sin copiar números de error del origen del controlador:
var transientErrors = SqlConfigurableRetryFactory.BaselineTransientErrors
.Append(12345)
.ToArray();
var options = new SqlRetryLogicOption
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(2),
MaxTimeInterval = TimeSpan.FromSeconds(30),
TransientErrors = transientErrors,
};
Para versiones anteriores del controlador, crea una colección propia de la aplicación que contenga los errores de referencia que necesites y tus errores adicionales. Antes de copiar una línea base, selecciona la etiqueta de código fuente SqlClient que coincida con la versión de tu paquete instalado e inspecciona SqlConfigurableRetryFactory.cs. La lista de la rama main puede cambiar tras el lanzamiento de tu paquete.
Errores durante el establecimiento de la conexión
Los siguientes errores se pueden volver a intentar en la lista integrada o merece la pena añadirlos a TransientErrors además de la lista integrada.
Los siguientes errores pueden ser transitorios cuando ocurren durante el establecimiento de la conexión o al enviar una solicitud al servidor. Reintentar con un retroceso breve y limitado. Los errores que persisten después de unos pocos intentos suelen indicar un problema de configuración, como un servidor equivocado, permisos faltos, ajustes de cifrado incompatibles o cuota agotada, que intentar de nuevo no solucionará.
| Error | Tipo de error | Message | Troubleshooting |
|---|---|---|---|
64 |
Transporte durante el inicio de sesión | 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 conexión TCP se interrumpe en medio del protocolo de enlace. No es un fallo de credenciales. Si persiste, compruebe si hay inestabilidad en la red del cliente o algún dispositivo intermedio que interrumpa conexiones establecidas solo parcialmente. |
233 |
Transporte previo al inicio de sesión o TLS | The client was unable to establish a connection because of an error during connection initialization process before login. |
El servidor suele devolver este error cuando no puede aceptar la conexión debido al agotamiento de recursos, un límite de conexión o un cliente no soportado. No es un fallo de credenciales. Compruebe el estado del servidor y, a continuación, compruebe el tiempo de espera de inicio de sesión del cliente, la configuración de TLS y la compatibilidad de la versión de TLS de cliente/servidor. |
4060 |
Disponibilidad o acceso a bases de datos | Cannot open database "%.*ls" requested by the login. The login failed. |
El inicio de sesión se autentica, pero no puede abrir la base de datos solicitada. Las causas transitorias incluyen que la base de datos está en transición (conmutación por error, restauración, escalado) o pausada automáticamente. Las causas persistentes (la base de datos no existe, el inicio de sesión carece de acceso) no se solucionarán con un nuevo intento; comprueba el nombre de la base de datos, la asignación de inicio de sesión y el estado de la base de datos. |
4221 |
Transición secundaria legible | Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
La réplica no está disponible para el inicio de sesión porque faltan versiones de fila para las transacciones que estaban en curso cuando se recicló la réplica. Revierte o confirma las transacciones activas en el servidor principal para resolver el problema. Mitíguelo evitando transacciones de escritura prolongadas en la base de datos principal. |
10053 |
Aborto del transporte 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.) |
El extremo local interrumpe la conexión. Compruebe el estado de la red del lado cliente y cualquier firewall local o cliente VPN. |
10054 |
Restablecimiento del transporte 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.) |
El extremo remoto envía un reinicio de TCP. Causas comunes: el proceso remoto se bloqueó, un firewall forzó un restablecimiento de la conexión o la puerta de enlace de Azure SQL cerró una conexión inactiva. Para los patrones de reinicio por inactividad, habilite TCP keepalive en el cliente o reduzca el tiempo de espera de inactividad del pool de conexiones. |
10060 |
Tiempo de espera de conexión | A connection attempt failed because the connected party did not properly respond after a period of time. |
El servidor o un dispositivo de red intermedio no respondió antes del tiempo de espera de la conexión TCP. Comprueba el estado del servidor, el enrutamiento, las reglas del firewall y si el host y el puerto configurados son accesibles. |
10928 |
Límite de recursos en bases de datos | Resource ID: %d. The %s limit for the database is %d and has been reached. |
La base de datos supera un límite de gobernanza de recursos Azure SQL. El identificador de recurso 1 indica el límite de trabajo; El identificador de recurso 2 indica el límite de sesión. Identifique el tipo de límite a partir del mensaje y reduzca la concurrencia, amplíe la base de datos o acorte las operaciones de larga duración que mantienen el recurso. |
10929 |
Limitación del rendimiento de la base de datos | 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 datos ha superado su garantía mínima y el servidor subyacente está limitando el rendimiento. El reintento suele tener éxito cuando disminuye la carga del vecino. Las apariciones sostenidas indican que necesita un nivel de servicio superior o un entorno menos ruidoso. |
40020, 40143, , 40166, 40540 |
Subcódigo de conmutación por error de Azure SQL | Notificado en el Error code %d campo del error 40197 durante la conmutación por error. |
Subcódigos incrustados en un mensaje de conmutación por error 40197 que, en algunas rutas, aparecen como número de error de primer nivel. Tratarlos igual que 40197. |
40197 |
Conmutación por error de Azure SQL | The service has encountered an error processing your request. Please try again. Error code %d. |
Una actualización de software, un error de hardware u otro evento de conmutación por error en Azure SQL. Al volver a conectarse, se le redirige a una réplica en buen estado. El código de error incluido identifica el tipo de conmutación por error. Si el error persiste, capture el identificador de seguimiento de sesión y póngase en contacto con el soporte técnico. |
40501 |
Limitación de Azure SQL | The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Limitación del motor de Azure SQL. El tiempo de espera mínimo recomendado es de 10 segundos. La limitación sostenida indica que la carga de trabajo ha superado la asignación de recursos de la base de datos; amplíe el nivel de servicio o reduzca la concurrencia. |
40613 |
Base de datos no 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 datos no está disponible, normalmente en medio de una conmutación por error o brevemente durante una operación de escalado. Vuelve a intentarlo con un retardo; si el problema persiste más allá de unos minutos, anota el ID de seguimiento de la sesión y abre un caso de soporte técnico. |
42108 |
Grupo de SQL en pausa | Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
El grupo de SQL dedicado (Synapse) está en un estado en pausa. El reintento solo tendrá éxito una vez que se haya reanudado el grupo. Reanuda el grupo de forma explícita o programa la carga de trabajo para que se ejecute una vez que el grupo se haya reanudado. |
42109 |
Reanudación del grupo de SQL | The SQL pool is warming up. Please try again. |
El grupo de SQL dedicado se está reactivando. Vuelve a intentarlo con un retardo hasta que el grupo esté en línea; el tiempo de calentamiento suele durar unos minutos. |
49918 |
Escasez de recursos de servicio | Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
El servidor no puede asignar recursos suficientes actualmente para satisfacer la solicitud. Vuelve a intentarlo con un retardo. Si el error persiste, aumente la capacidad de la base de datos o del grupo elástico. |
49919 |
Limitación de operaciones de administración | Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
Límite de concurrencia a nivel de suscripción en las operaciones de administración. Reduzca las llamadas de creación y actualización paralelas o escalonelas. |
49920 |
Limitación de velocidad de las operaciones de suscripción | Cannot process request. Too many operations in progress for subscription "%ld". |
Límite de concurrencia en el nivel de suscripción en operaciones en curso. Reduce el paralelismo o espera a que finalicen las operaciones en curso. |
Los errores en el nivel de instrucción no figuran en esta lista porque se producen después de que se haya establecido la conexión y el error permite seguir utilizando la sesión. Los errores de instrucción más comunes que se pueden reintentar son el 1205 (víctima de interbloqueo) y el 1222 (tiempo de espera de solicitud de bloqueo agotado). Reintenta toda la transacción en lugar de la única instrucción que ha generado un error.
El texto del mensaje de error procede de Azure SQL errores de conexión transitorios. Estos errores se pueden volver a intentar en SQL Server, Azure SQL Database, Azure SQL Managed Instance, la base de datos SQL de Microsoft Fabric y los pools SQL dedicados de Azure Synapse Analytics.
Errores durante la ejecución de comandos
Los siguientes errores ocurren después de establecer una conexión, mientras se ejecuta un comando. Vuelve a intentar toda la transacción, no solo la instrucción individual. Volver a intentar una sola instrucción dentro de una transacción puede duplicar el trabajo anterior o incumplir las garantías de ordenación de la transacción.
| Error | Tipo de error | Message | Troubleshooting |
|---|---|---|---|
1204 |
Recursos de bloqueo agotados | 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. |
El gestor de bloqueos no puede asignar más recursos de bloqueo en el servidor. Revierta la transacción y vuelva a intentarla tras un breve intervalo de espera. Las ocurrencias sostenidas indican contención o presión de memoria que deben resolverse mediante el escalado o la optimización de consultas. |
1205 |
Víctima de interbloqueo | Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. |
El motor seleccionó esta sesión para romper un interbloqueo y revirtió su transacción. Revierta la transacción en el lado del cliente para liberar cualquier estado restante y, a continuación, vuelva a intentar la transacción completa. |
1222 |
Tiempo de espera para la solicitud de bloqueo | Lock request time out period exceeded. |
El motor dejó de esperar un bloqueo. Reintenta la transacción tras una breve espera. Las ocurrencias recurrentes indican un bloqueo que debe resolverse mediante la indexación, el ajuste de consultas o la revisión de SET LOCK_TIMEOUT. |
3960 |
Conflicto de actualización en aislamiento de instantánea | 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. |
Dos transacciones que se ejecutaban bajo aislamiento de instantánea intentaron actualizar la misma fila. El motor abortó esta transacción. Vuelve a intentar toda la transacción o cambia el nivel de aislamiento para la escritura conflictiva. Añade a una lista personalizada de errores transitorios si tu aplicación usa aislamiento de instantáneas. |
Los errores a nivel de sentencia que reflejan un problema de lote o esquema (por ejemplo, 102 errores de sintaxis, 207 columna inválida, 2812 procedimiento almacenado perdido) no son transitorios. Fijar el texto de consulta o la vinculación del esquema; Reintentar no ayuda.
El texto del mensaje de error procede de la vista de catálogo sys.messages. Estos errores provienen del motor SQL Server, por lo que sus números son los mismos en SQL Server, Azure SQL Database, Azure SQL Managed Instance, base de datos SQL en Microsoft Fabric y pools SQL dedicados en Azure Synapse Analytics, independientemente del driver.
El controlador, y no el motor, muestra las representaciones del lado del cliente de los errores de tiempo de espera y cancelación de instrucciones (por ejemplo, el tiempo de espera de Microsoft.Data.SqlClient -2), por lo que estos errores no figuran en la lista integrada. Si tu aplicación detecta estos errores por separado, trátalos en el mismo límite de transacción que los errores del motor descritos anteriormente.
Comportamiento de comandos y transacciones
Los proveedores integrados omiten el reintento cuando un comando se ejecuta dentro de un TransactionScope ambiental o tiene un SqlTransaction asociado. El comando se ejecuta una vez sin lógica de reintento. Reintentar una sola instrucción dentro de una transacción puede duplicar el trabajo anterior o infringir el orden previsto de la transacción.
Caution
En caso de interbloqueos y otros errores que se puedan reintentar dentro de una transacción, revierta y vuelva a intentar toda la transacción como una sola unidad. No vuelvas a intentar solo el comando que falló.
Use SqlRetryLogicOption.AuthorizedSqlCondition para limitar los reintentos de comandos a operaciones que tu aplicación pueda repetir de forma segura. El predicado recibe el texto del comando. Si el predicado devuelve false, el comando se ejecuta una vez sin lógica de reintento.
Ejemplo
Para ejemplos completos de conexión y comandos, véase: