Configurar la lógica de reintentos en SqlClient

Se aplica a: .NET Framework .NET Standard

Descargar ADO.NET

Este artículo muestra cómo crear un proveedor de reintentos exponenciales y asignarlo a un SqlConnection. El proveedor vuelve a intentar los errores de conexión transitorios de la lista integrada del controlador e intenta abrir la conexión hasta cinco veces.

Prerequisites

  • Microsoft. Data.SqlClient 3.0 o una versión posterior.
  • Una cadena de conexión para SQL Server, Azure SQL Database, Azure SQL Managed Instance o una base de datos SQL en Microsoft Fabric.

Configurar un proveedor de reintentos de conexión

  1. Define las opciones de reintento. Deja TransientErrors como null para que el proveedor use la lista de errores transitorios incorporada.

    // Define the retry logic parameters
    var options = new SqlRetryLogicOption()
    {
        // Tries 5 times before throwing an exception
        NumberOfTries = 5,
        // Preferred gap time to delay before retry
        DeltaTime = TimeSpan.FromSeconds(1),
        // Maximum gap time for each delay time before retry
        MaxTimeInterval = TimeSpan.FromSeconds(20)
    };
    
  2. Crea un proveedor entre las opciones.

    // Create a retry logic provider
    SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
    
  3. Asigna el proveedor antes de abrir la conexión.

    // Assumes that connection is a valid SqlConnection object 
    // Set the retry logic provider on the connection instance
    connection.RetryLogicProvider = provider;
    // Establishing the connection will retry if a transient failure occurs.
    connection.Open();
    

NumberOfTries = 5 permite un intento inicial y hasta cuatro intentos. El proveedor exponencial aumenta el intervalo entre intentos y añade fluctuaciones aleatorias. MaxTimeInterval Limita cada retraso individual, no el tiempo total transcurrido de todos los intentos.

Configurar reintentos de comandos

Crea un proveedor separado y asígnalo a SqlCommand.RetryLogicProvider. Establece SqlRetryLogicOption.AuthorizedSqlCondition un predicado que solo devuelva true los comandos que tu aplicación pueda repetir con seguridad.

Caution

Un proveedor integrado no vuelve a intentar un comando cuando la conexión tiene una transacción activa. Si un fallo transitorio invalida una transacción, revierte y vuelve a intentar toda la transacción. No vuelvas a intentar solo la instrucción que ha fallado.

La configuración SqlRetryLogicOption.TransientErrors reemplaza la lista de errores integrada del controlador. Para extender la línea base sin perder los valores predeterminados, véase Extender la lista de errores transitorios incorporada.