A tabela wp_options guarda desde o nome do seu site até dados temporários que plugins gravam a cada segundo. Quando muitas pessoas usam o site ao mesmo tempo, dois processos do PHP podem tentar atualizar registros diferentes dessa mesma tabela em ordens trocadas. Como um fica esperando o outro liberar o acesso, cria-se um travamento mútuo chamado deadlock. O MySQL aborta uma das operações na hora e o usuário vê na tela o aviso de “Houve um erro crítico no seu site”. Veja como achar essas consultas travadas e como resolver isso em definitivo em Otimização de Sites e Servidores.

O que você vai aprender
- 1. Como dois processos travam um ao outro no MySQL
- 2. Como ver o último deadlock com SHOW ENGINE INNODB STATUS
- 3. Por que os transients e o autoload causam essas brigas
- 4. A solução definitiva: migrar transients para o Redis
- 5. Comandos SQL para limpar e indexar a wp_options
- 6. Como deixar seu banco de dados estável
1. Como dois processos travam um ao outro no MySQL
O motor InnoDB do MySQL usa bloqueios em nível de linha para garantir que ninguém altere um dado que já está sendo modificado por outra pessoa. Um deadlock acontece quando a situação fica assim:
- O Processo A bloqueia a linha do token do usuário e precisa atualizar o timestamp do cron.
- O Processo B já bloqueou a linha do timestamp do cron e precisa atualizar o token do usuário.
Nenhum dos dois consegue terminar porque cada um está esperando a linha que o outro segurou. O MySQL tem um detector automático que percebe o impasse e cancela (faz rollback) uma das duas transações com o erro Deadlock found when trying to get lock; try restarting transaction. Se o plugin ou tema não tiver tratamento para tentar de novo, o usuário vê uma tela de erro ou perde o carrinho.
Seu WordPress apresenta erro crítico sem motivo aparente?
Deadlocks na wp_options quebram sessões e assustam clientes no checkout. Nós identificamos quais plugins estão gerando essas brigas de escrita no seu banco.
2. Como ver o último deadlock com SHOW ENGINE INNODB STATUS
Para descobrir quais queries SQL exatas provocaram o último conflito, acesse o MySQL pelo terminal ou phpMyAdmin e rode este comando:
SHOW ENGINE INNODB STATUS\G
Procure pelo bloco chamado LATEST DETECTED DEADLOCK. Lá você verá o texto completo das duas consultas e os IDs dos processos envolvidos:
*** (1) TRANSACTION:
UPDATE `wp_options` SET `option_value` = '...' WHERE `option_name` = '_transient_cart_session'
*** (2) TRANSACTION:
UPDATE `wp_options` SET `option_value` = '...' WHERE `option_name` = 'cron'
*** WE ROLL BACK TRANSACTION (1)
3. Por que os transients e o autoload causam essas brigas
Em quase todos os sites onde encontro deadlocks, a culpa é da quantidade de opções marcadas com autoload = 'yes'. O WordPress carrega todas as opções com autoload de uma vez só em cada página que abre. Se você tem 50.000 transients antigos acumulados de plugins desinstalados, essa consulta de leitura fica muito pesada e segura travas de intervalo (gap locks) na tabela enquanto outras threads tentam atualizar dados.
Esse tipo de investigação detalhada faz parte da nossa Auditoria Técnica Especializada.
Cuidado ao rodar comandos de DELETE direto no banco de produção
Apagar linhas da wp_options sem validar o que é transient e o que é configuração pode quebrar seu tema. Faça isso com apoio de especialistas.
4. A solução definitiva: migrar transients para o Redis
A melhor solução técnica para acabar com deadlocks na wp_options é tirar os dados temporários do disco e colocar na memória RAM usando o Redis Object Cache.
Quando o Redis está ativo com o driver phpredis, o WordPress para de gravar transients no MySQL. Todas as sessões, tokens e caches de curta duração passam a ser gravados direto na memória RAM com expiração automática. A tabela wp_options fica apenas com as configurações fixas do site e os deadlocks somem por completo.
5. Comandos SQL para limpar e indexar a wp_options
Se você já tem muitos registros órfãos acumulados, faça um backup do banco de dados e rode esta limpeza no MySQL:
-- Remove transients antigos acumulados
DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_transient\_%');
DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_site\_transient\_%');
-- Cria índice composto para acelerar as consultas de autoload
CREATE INDEX autoload_idx ON wp_options (autoload, option_name);
OPTIMIZE TABLE wp_options;
Essa limpeza reduz o tempo de carregamento da wp_options para menos de 2ms, ajudando diretamente no tempo de resposta geral e nas métricas de Core Web Vitals e SEO Técnico.
6. Como deixar seu banco de dados estável
Erros de banco de dados assustam visitantes e custam vendas. Se você quer deixar seu WordPress estável, rápido e preparado para receber milhares de acessos simultâneos sem travar, fale diretamente com Jonathan Pavão.
Converse comigo pelo WhatsApp
Vamos analisar o seu banco de dados e eliminar os erros críticos no seu site.