Banco de dados 0 visualizações

Como resolver um erro de deadlock em consultas simultâneas ao MySQL

Ver no WHMCS

Como resolver um erro de deadlock em consultas simultâneas ao MySQL

Olá, querido cliente da GeHost! 😊

Se você está lendo este guia, provavelmente já enfrentou um erro como "Deadlock found when trying to get lock; try restarting transaction" ao usar seu banco de dados MySQL. Não se preocupe — isso é mais comum do que parece, e tem solução! Vou te guiar com calma, como um bom Sensei. 🌿

O que é um deadlock?

Imagine duas pessoas tentando pegar o mesmo copo e o mesmo prato ao mesmo tempo. Se cada uma segura um item e espera o outro soltar o outro, ninguém consegue usar nada. Isso é um deadlock — um impasse no sistema.

No MySQL, um deadlock acontece quando duas ou mais consultas (transações) esperam por recursos que estão bloqueados por outras, criando um ciclo de espera infinita.

Dica do Sensei: O MySQL detecta deadlocks automaticamente e interrompe uma das transações para resolver o impasse. Ele não deixa o sistema travar — mas o erro aparece no seu aplicativo. É o sistema tentando te avisar: "Cuidado, temos um impasse!"

Passo a passo: Como resolver e prevenir deadlocks

  1. Verifique o código do seu aplicativo

    Deadlocks geralmente acontecem por causa de ordem incorreta de acesso a tabelas ou transações muito longas. Por exemplo: se uma parte do seu sistema atualiza a tabela A primeiro, e outra atualiza a tabela B primeiro, há risco de impasse.

    Resolução: Garanta que todas as consultas acessem as tabelas na mesma ordem em todos os lugares.

  2. Reduza o tempo de transação

    Quanto mais tempo uma transação demora, maior o risco de deadlock. Evite deixar transações abertas por muito tempo.

    Resolução: Faça o mínimo possível dentro de uma transação. Por exemplo, não faça chamadas externas (APIs, processos lentos) dentro da transação.

  3. Use o comando ROLLBACK ou RETRY no seu código

    Como o MySQL já interrompe uma transação em caso de deadlock, seu código deve estar preparado para isso.

    Resolução: Implemente uma lógica de repetição (retry) com um número limitado de tentativas. Se o erro ocorrer, espere um segundo e tente novamente.

    Exemplo simples em PHP (pseudocódigo):

          $tentativas = 0;
          while ($tentativas < 3) {
              try {
                  // Executa a transação
                  $pdo->beginTransaction();
                  // ... suas consultas ...
                  $pdo->commit();
                  break;
              } catch (PDOException $e) {
                  if (strpos($e->getMessage(), 'Deadlock') !== false) {
                      $tentativas++;
                      sleep(1); // Espera 1 segundo antes de tentar novamente
                  } else {
                      throw $e;
                  }
              }
          }
        
  4. Verifique o uso de locks no MySQL

    Evite usar LOCK TABLES ou SELECT ... FOR UPDATE de forma excessiva. Isso pode criar gargalos.

    Resolução: Use apenas quando necessário e libere os locks o mais rápido possível.

  5. Monitore consultas lentas no cPanel

    Consultas muito lentas aumentam o tempo de bloqueio e o risco de deadlock.

    Para verificar, acesse o phpMyAdmin no seu cPanel:

    Tela de Bancos de Dados MySQL no cPanel

    Clique em phpMyAdmin e, na parte superior, vá em Processos (ou "Processes"). Lá você verá todas as conexões ativas e pode identificar consultas que estão demorando muito.

Como prevenir no futuro?

  • Use transações curtas e evite operações pesadas dentro delas.
  • Garanta que todas as partes do seu sistema acessem tabelas na mesma ordem.
  • Evite consultas longas ou com loops desnecessários.
  • Use índices corretamente — consultas sem índice são lentas e aumentam o risco de bloqueios.

Dica do Sensei: Se você não tem controle total sobre o código (por exemplo, está usando um sistema como WordPress, WooCommerce ou outro CMS), entre em contato com o suporte da GeHost. Nós podemos ajudar a identificar se há algo no banco que esteja causando sobrecarga.

Quer ajuda com isso?

Se você não sabe como ajustar o código ou não tem acesso ao sistema, basta entrar em contato com nosso suporte técnico pelo painel do cliente:

  • Acesse: painel.gehost.com.br
  • Entre com seu login e senha
  • Abra um chamado com o título: “Erro de deadlock no MySQL – preciso de ajuda”
  • Envie o trecho do erro (se possível) e um breve contexto do que está fazendo.

Estamos aqui para te ajudar — não hesite em pedir! 💪

Com carinho,
Sensei da GeHost
Grupo: G e Soluções e Eventos LTDA (CNPJ: 46.647.904/0001-04)

Precisa de Ajuda?

Nossa equipe está pronta para resolver suas dúvidas.