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 los calendarios comunes de reintentos. 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 jitter aleatorio a cada intervalo. La variación aleatoria reduce las ráfagas sincronizadas en los reintentos cuando muchos clientes experimentan la misma interrupción.
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 |
| A nivel de sentencia |
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 de controladores, crea una colección propiedad de la aplicación que contenga los errores base que necesitas 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 en la main sucursal puede cambiar después de que liberen 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. Vuelva a intentarlo en un retroceso corto 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 a mitad del establecimiento de conexión. 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 no tiene acceso) no se corregirán reintentando; compruebe el nombre de la base de datos, la asociación del 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 reciclaba la réplica. Revierta o confirme 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 |
Cancelación 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 |
Reinicio remoto de transporte | 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 supera su garantía mínima y el servidor subyacente está limitando. Normalmente, el reintento suele tener éxito cuando disminuye la carga de los vecinos. Las apariciones sostenidas indican que necesita un nivel de servicio superior o un entorno menos ruidoso. |
40020, 40143, , 40166, 40540 |
Subcódigo de failover de Azure SQL | Se informó de la ranura Error code %d del error 40197 durante la conmutación por error. |
Subcódigos integrados en un mensaje de conmutación por error con código 40197 que algunas rutas presentan como número de error de nivel superior. Tratarlos igual que 40197. |
40197 |
Azure SQL failover | 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 dirige a una réplica en buen estado. El código de error integrado 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 |
Azure SQL throttling | 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 persistente indica que la carga de trabajo superó la asignación de recursos de la base de datos; escale a un nivel de servicio superior 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 durante una conmutación por error o brevemente durante una operación de escalado. Reintentar tras un tiempo de espera progresivo; si el problema persiste más de unos minutos, capturar el ID de seguimiento de la sesión y abrir un caso de soporte. |
42108 |
Pool SQL pausado | 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 tiene éxito después de que se reanude la agrupación. Reanude explícitamente el grupo o programe la carga de trabajo para que se ejecute después de reanudar el grupo. |
42109 |
Pool SQL reanudándose | The SQL pool is warming up. Please try again. |
El grupo de SQL dedicado se está reactivando. Vuelva a intentarlo con un intervalo de espera creciente hasta que el pool esté en línea; el calentamiento suele tardar 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. Vuelva a intentarlo después de un tiempo de espera. 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 a nivel de suscripción para las operaciones en ejecución. Reduzca el paralelismo o espere a que finalicen las operaciones en curso. |
Los errores a nivel de instrucción no están en esta lista porque se producen después de que se haya establecido la conexión y el fallo no impide seguir usando la sesión. Los errores de instrucciones que se pueden reintentar más comunes son 1205 (víctima de interbloqueo) y 1222 (tiempo de espera de la solicitud de bloqueo). Reintente la transacción completa en lugar de la sola instrucción que falla.
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 el extracto individual. Volver a intentar una instrucción dentro de una transacción puede duplicar trabajos anteriores o violar las garantías de orden 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. Reverte la transacción y vuelve a intentarlo tras un breve retroceso. 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 eligió esta sesión para romper un bloqueo y revertió su transacción. Haz una reversión en el cliente para liberar cualquier estado restante y luego vuelve 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 a que se cerrara el vehículo. Reintenta la transacción tras una breve espera. Las ocurrencias recurrentes indican un bloqueo que la indexación, el ajuste de consultas o SET LOCK_TIMEOUT la revisión deben abordar. |
3960 |
Conflicto de actualización en el aislamiento de instantáneas | 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 ejecutándose bajo aislamiento de instantáneas intentaron actualizar la misma fila. El motor abortó esta transacción. Reintenta toda la transacción o cambia el nivel de aislamiento de la escritura en conflicto. 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, no el motor, expone representaciones del lado cliente de los errores de tiempo de espera de instrucción y de cancelación (por ejemplo, el tiempo de espera de Microsoft.Data.SqlClient -2), por lo que estos errores no están en la lista incorporada. 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 saltan el intento cuando un comando se ejecuta dentro de un ambiente TransactionScope o tiene un SqlTransaction adjunto. El comando se ejecuta una vez sin lógica de reintento. Reintentar una única instrucción dentro de una transacción puede duplicar operaciones previas o vulnerar el orden previsto de la transacción.
Caution
Para bloqueos y otros fallos reintentables dentro de una transacción, reverte y vuelve 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: