# Como corrigir Deadlock found when trying to get lock

O erro Deadlock no MySQL do WordPress ocorre quando duas transações ficam presas esperando uma pela liberação do lock que a outra segura, e o InnoDB aborta uma delas para destravar. No WordPress costuma vir de plugins que gravam no banco em paralelo, de cron pesado ou de picos de escrita simultânea na mesma tabela.

## O que é o erro Deadlock no MySQL do WordPress?

Deadlock found when trying to get lock é o erro que o MySQL devolve quando duas ou mais transações se bloqueiam mutuamente: cada uma segura um lock que a outra precisa, e nenhuma avança. Para não travar o banco, o InnoDB detecta o impasse e desfaz uma das transações com esse erro. No WordPress, isso aparece quando vários processos escrevem ao mesmo tempo na mesma tabela, por exemplo plugins de cache, de estatísticas ou o WooCommerce processando pedidos em paralelo. Não é corrupção: é contenção de escrita, e a operação abortada normalmente pode ser repetida.

## Como identificar

- O log de erros do PHP ou do MySQL mostra "Deadlock found when trying to get lock; try restarting transaction".
- Uma ação no painel falha de forma intermitente e funciona ao ser repetida segundos depois.
- O erro surge em horários de pico de tráfego ou quando o cron do WordPress roda tarefas pesadas.
- Plugins de estatística, fila ou WooCommerce registram falhas de gravação esporádicas no banco.

## Como prevenir

- Use um cron real do servidor com execução espaçada em vez do WP-Cron em sites movimentados
- Mantenha plugins de cache, fila e estatística atualizados para evitar bugs de concorrência
- Evite transações longas e operações de escrita em massa nos horários de pico de tráfego

Erros relacionados

- [Como corrigir Max connections reached no MySQL](https://full.services/wp-fixer/corrigir-max-connections-mysql-wordpress/)
- [Como corrigir MySQL server has gone away](https://full.services/wp-fixer/corrigir-mysql-server-has-gone-away/)
- [Como corrigir One or more database tables are unavailable](https://full.services/wp-fixer/corrigir-database-tables-unavailable-wordpress/)

## Causa

- Duas transações gravando na mesma tabela em ordem inversa de locks, travando uma à outra.
- Plugins de cache, fila ou estatística escrevendo em paralelo na wp_options ou em tabelas próprias.
- Cron do WordPress disparando tarefas pesadas de escrita ao mesmo tempo que requisições de usuário.
- WooCommerce processando muitos pedidos simultâneos que disputam locks nas tabelas de pedidos.
- Transações longas que seguram locks por tempo demais durante picos de escrita concorrente.

## Como resolver

1. Entenda que o deadlock é recuperável: o InnoDB aborta apenas uma das transações para destravar; a outra conclui normalmente. Muitas vezes basta repetir a operação que falhou, pois o impasse momentâneo já se desfez.
2. Identifique o plugin ou processo envolvido: veja no log de erros o horário e a tabela citada no deadlock. Cruze com plugins de cache, estatística ou fila ativos. Desative temporariamente o suspeito e observe se os deadlocks param.
3. Reduza a concorrência do cron: se o cron do WordPress dispara tarefas pesadas em paralelo, troque o WP-Cron por um cron real do servidor com execução espaçada, para as escritas não competirem pelos mesmos locks ao mesmo tempo.
4. Atualize os plugins envolvidos: deadlocks recorrentes ligados a um plugin específico costumam ser bugs de concorrência já corrigidos. Atualize o plugin à última versão e verifique o changelog por correções de gravação no banco.
5. Acompanhe a frequência depois do ajuste: deadlocks raros e isolados são normais em bancos transacionais. Só preocupe-se se forem frequentes; nesse caso, leve o trecho do InnoDB status ao suporte da hospedagem para análise mais fina.

## Código

```sql
-- Veja os detalhes do ultimo deadlock detectado pelo InnoDB
SHOW ENGINE INNODB STATUS;
-- Procure a secao 'LATEST DETECTED DEADLOCK' na saida: ela mostra as duas
-- transacoes, as queries e as tabelas que se bloquearam.

-- Liste transacoes ativas e ha quanto tempo seguram locks (MySQL 8)
SELECT trx_id, trx_state, trx_started, trx_mysql_thread_id, trx_query
FROM information_schema.innodb_trx
ORDER BY trx_started;
```

## Perguntas frequentes

### O que significa Deadlock found when trying to get lock?

Significa que duas transações se bloquearam mutuamente, cada uma segurando um lock que a outra precisava. O InnoDB detectou o impasse e abortou uma delas para destravar o banco. A operação abortada geralmente pode ser repetida com sucesso.

### Deadlock no MySQL corrompe meu banco de dados?

Não. Deadlock é contenção de escrita, não corrupção. O InnoDB desfaz uma das transações de forma limpa e a outra conclui normalmente. O dado fica consistente; o que você perde é apenas a transação abortada, que pode ser refeita.

### Por que o deadlock acontece só nos horários de pico?

Porque o pico aumenta as escritas simultâneas na mesma tabela. Quanto mais transações concorrendo pelos mesmos locks ao mesmo tempo, maior a chance de duas se travarem. Reduzir a concorrência do cron e de plugins costuma diminuir a frequência.

### Como descubro qual plugin causa os deadlocks?

Rode SHOW ENGINE INNODB STATUS e leia a seção LATEST DETECTED DEADLOCK, que mostra as queries e tabelas envolvidas. Cruze a tabela citada e o horário do log com os plugins ativos de cache, fila ou estatística para achar o responsável.

### Preciso me preocupar com deadlocks raros?

Não. Em bancos transacionais como o InnoDB, deadlocks isolados são esperados e a aplicação simplesmente repete a operação. A preocupação só faz sentido quando são frequentes a ponto de fazer ações do site falharem de forma perceptível.

### Trocar o WP-Cron por cron do servidor ajuda contra deadlocks?

Sim. O WP-Cron pode disparar tarefas pesadas junto com requisições de usuário, somando escritas concorrentes. Um cron real do servidor, com execução espaçada, separa esses processos no tempo e reduz a disputa pelos mesmos locks.

**Fonte:** [MySQL Documentation — 15.7.5 Deadlocks in InnoDB](https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks.html)
