Configurar lógica de retentativa no SqlClient

Aplica-se a: .NET Framework .NET .NET Standard

Baixar ADO.NET

Este artigo mostra como criar um provedor de nova tentativa exponencial e atribuí-lo a um SqlConnection. O provedor realiza novas tentativas com base na lista integrada do driver de erros de conexão transitórios e tenta abrir a conexão até cinco vezes.

Pré-requisitos

  • Microsoft. Data.SqlClient 3.0 ou uma versão posterior.
  • Uma cadeia de conexão para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure ou um banco de dados SQL no Microsoft Fabric.

Configurar um provedor de repetição de tentativas de conexão

  1. Defina as opções de retentativa. Deixe TransientErrors as null para que o provedor use a lista de erros transitórios embutida.

    // 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. Crie um provedor com as opções.

    // Create a retry logic provider
    SqlRetryLogicBaseProvider provider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider(options);
    
  3. Atribua o provedor antes de abrir a conexão.

    // 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 uma tentativa inicial e até quatro tentativas. O provedor exponencial aumenta o intervalo entre as tentativas e adiciona jitter aleatório. MaxTimeInterval limita cada atraso individual, não o tempo total decorrido para todas as tentativas.

Configurar novas tentativas de comando

Crie um provedor separado e o atribui a SqlCommand.RetryLogicProvider. Defina SqlRetryLogicOption.AuthorizedSqlCondition para um predicado que retorna true apenas para comandos que sua aplicação pode repetir com segurança.

Caution

Um provedor embutido não tenta novamente um comando quando a conexão tem uma transação ativa. Se uma falha transitória invalidar uma transação, volte para trás e tente toda a transação novamente. Não tente executar novamente apenas a instrução que falhou.

A configuração SqlRetryLogicOption.TransientErrors substitui a lista de erros embutida do driver. Para estender a linha de base sem perder os padrão, veja Estender a lista de erros transitórios embutida.