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
La lógica de reintento configurable (CRL) permite a Microsoft.Data.SqlClient reintentar las operaciones SqlConnection y SqlCommand seleccionadas tras fallos transitorios. Eliges qué errores califican, cuántos intentos realizar, cuántos retrasos aumentan entre intentos y qué comandos son seguros de repetir.
CRL está desactivado por defecto. Lo activas asignando un proveedor a una conexión, un comando o ambos. Los dos proveedores son independientes: asignar un proveedor a una conexión no la aplica a los comandos creados desde esa conexión.
Nota
CRL está disponible en Microsoft. Data.SqlClient 3.0 y posteriores. El valor por defecto es SqlConfigurableRetryFactory.CreateNoneRetryProvider, que no lo vuelve a intentar.
Qué reintenta CRL
| Scenario | Asignar el proveedor a | Fallos típicos |
|---|---|---|
| Abre una conexión | SqlConnection.RetryLogicProvider | Conmutación por error, limitación de velocidad, breve indisponibilidad de la base de datos y errores de transporte durante el establecimiento de la conexión. |
| Ejecutar un comando | SqlCommand.RetryLogicProvider | Fallas de instrucciones seleccionadas que se pueden repetir de forma segura fuera de una transacción. |
Para el catálogo compartido de errores de conexión que son elegibles para reintentos 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, consulta Lista de errores transitorios incorporados.
Elige una ruta de configuración
| tarea | Artículo |
|---|---|
| Crea y asigna un proveedor mediante código | Configurar la lógica de reintentos en SqlClient |
| Compara proveedores fijos, incrementales, exponenciales y sin reintentos | Proveedores de lógica de reintentos integrados en SqlClient |
| Establecer valores predeterminados a nivel de aplicación en un archivo de configuración | Configurar la lógica de reintentos de SqlClient con un archivo de configuración |
| Implementa un intervalo personalizado, una condición de error o un proveedor | Crea un proveedor de reintentos personalizado para SqlClient |
Diseña una política segura de reintentos
- Reintenta solo fallos que probablemente se resuelvan sin cambiar la entrada de la aplicación.
- Limita los reintentos tanto por el número de intentos como por el retraso máximo. Un bucle de reintento sin límites puede convertir una interrupción en carga sostenida.
- Trata
NumberOfTriescomo el número total de intentos, incluyendo la operación inicial. - Añade fluctuación para que muchos clientes no vuelvan a intentarlo simultáneamente. Los proveedores integrados añaden fluctuación automáticamente.
- Reintenta toda la transacción, no solo una instrucción de la misma. Los proveedores de comandos integrados no reintentan los comandos cuando la conexión tiene una transacción activa.
- Restringir los reintentos de comandos a operaciones idempotentes, o a operaciones protegidas por un mecanismo de idempotencia a nivel de aplicación.
- Registra el Retrying evento para distinguir fallos transitorios recuperados de incidentes persistentes.
Para orientación general sobre arquitectura, véase patrón de Retry. Para la guía de errores de Azure SQL, véase Errores transitorios.
Tiempos de espera del cliente y reanudación sin servidor
CRL solo reintenta los errores que el controlador recibe realmente. Un tiempo de espera en el lado cliente se muestra como el error -2, que no está en la lista integrada de errores transitorios, por lo que los proveedores integrados no reintentan un Open() ni un comando que alcance el tiempo de espera del cliente.
ConnectTimeout y CommandTimeout deben ser lo suficientemente largos para cubrir la operación por sí solos.
Esta condición es la que más importa para la capa de computación Serverless de Azure SQL Database con la pausa automática activada. Una base de datos con pausa automática se reanuda con la primera Open(), y la reanudación puede tardar de 30 a 60 segundos o más. Aumenta ConnectTimeout a al menos 60 segundos cuando el destino pueda pausarse automáticamente. La lógica de reintentos gestiona entonces los fallos transitorios restantes (por ejemplo 40613, , 40197, y 40501) mientras la base de datos se conecta.