MySQL e MariaDB travando? Entenda locks e deadlocks
Por que o MySQL e o MariaDB parecem travar, como descobrir quem está bloqueando quem e como evitar deadlocks.

Sabe aquele cruzamento em que cada carro espera o da frente andar, e o da frente espera o de trás? Ninguém sai do lugar. No InnoDB, do MySQL e do MariaDB, isso tem nome: deadlock. E o primo mais comum dele, o lock wait, é o que faz a aplicação "travar".
Resumo rápido: Por que o MySQL e o MariaDB parecem travar, como descobrir quem está bloqueando quem e como evitar deadlocks.
Série MySQL e MariaDB na prática: comandos válidos para MySQL 8.x e MariaDB 10.6+/11.x, com as diferenças indicadas quando existem.
Lock wait versus deadlock
LOCK WAIT (fila) DEADLOCK (ciclo)
T1 segura linha A T1 segura A, quer B
T2 quer A → espera... T2 segura B, quer A
T1 commita → T2 segue ↺ ninguém cede → InnoDB mata uma (rollback)
(ou T2 desiste: erro 1205) erro 1213: Deadlock found
Que locks o InnoDB usa?
- Record lock: trava a linha (o registro do índice).
- Gap lock e next-key lock: travam o intervalo entre registros, para impedir "linhas fantasmas" no isolamento REPEATABLE READ (padrão do MySQL e do MariaDB).
- Metadata lock: um ALTER TABLE espera todas as transações que tocaram a tabela, e todo mundo que chega depois espera o ALTER. É o famoso "o banco travou depois do deploy".
Quem está bloqueando quem?
-- MySQL 8 e MariaDB com sys schema
SELECT waiting_pid, waiting_query, blocking_pid, blocking_query, wait_age
FROM sys.innodb_lock_waits;
-- Transações abertas há muito tempo (em qualquer um dos dois)
SELECT trx_mysql_thread_id AS pid, trx_started, trx_state, trx_query
FROM information_schema.innodb_trx ORDER BY trx_started;
-- Metadata locks
SELECT * FROM sys.schema_table_lock_waits; -- MySQL 8
-- Último resolvido: encerre com cuidado
KILL 1234;
Lendo o último deadlock
SHOW ENGINE INNODB STATUS\G -- seção LATEST DETECTED DEADLOCK
SET GLOBAL innodb_print_all_deadlocks = ON; -- grava todos no log de erro
Ali você vê as duas transações, os comandos e os índices envolvidos. Quase sempre aparece um destes padrões:
Como evitar
- Mesma ordem sempre: se todo mundo atualiza conta A e depois conta B, não há ciclo.
- Transações curtas: nada de chamar API externa com transação aberta.
- Índices nos filtros de UPDATE/DELETE: sem índice, o InnoDB trava muito mais linhas (e intervalos) do que precisa.
- Lotes pequenos: apague 1 milhão de linhas em blocos de 5.000.
- READ COMMITTED reduz gap locks, se a aplicação aceitar.
- Repetir a transação: deadlock ocasional é normal; a aplicação deve tentar de novo.
- ALTER TABLE online com
ALGORITHM=INPLACE, LOCK=NONEe, antes, conferir transações longas.
-- Errado: sem índice em status, varre e trava a tabela
UPDATE pedidos SET status='cancelado' WHERE status='pendente' AND criado_em < NOW() - INTERVAL 30 DAY;
-- Melhor: índice + lote
CREATE INDEX idx_status_data ON pedidos (status, criado_em);
UPDATE pedidos SET status='cancelado'
WHERE status='pendente' AND criado_em < NOW() - INTERVAL 30 DAY LIMIT 5000;
Travamento também pode ser outra coisa. Confira as 12 causas comuns de lentidão.
A série completa: MySQL e MariaDB na prática
- MySQL e MariaDB lentos? 12 causas comuns (e como resolver)
- Como fazer um health check completo no MySQL e MariaDB
- MySQL e MariaDB travando? Entenda locks e deadlocks
- Como otimizar o InnoDB buffer pool no MySQL e MariaDB
- Como encontrar queries lentas no MySQL e MariaDB
- Índices no MySQL e MariaDB: quando criar e quando remover
- Consultoria MySQL e MariaDB: quando vale a pena contratar um DBA especializado?
- DBA remoto para MySQL e MariaDB: como funciona?
- Assessment MySQL e MariaDB: o que é avaliado?
- Backup e disaster recovery no MySQL e MariaDB
Precisa de ajuda especializada?
Se o seu ambiente MySQL ou MariaDB precisa de diagnóstico, otimização, backup confiável ou acompanhamento contínuo, conheça a HTI Tecnologia, especialista em bancos de dados.
Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.
Quer dominar a base que os dois compartilham?
MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.
Conheça o livro e leia a degustação gratuita.
Bora trocar ideia?
Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.
Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.
Fontes: MySQL 8.4 Reference Manual (Oracle), MariaDB Server Documentation (MariaDB Knowledge Base), documentação do Percona Toolkit e do Percona XtraBackup. Imagem de capa: ilustração gerada por IA (cruzamento congestionado visto de cima com carros bloqueando uns aos outros).