← Voltar ao blog
MySQL 5 min de leitura

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.

MySQL e MariaDB travando? Entenda locks e 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

  1. Mesma ordem sempre: se todo mundo atualiza conta A e depois conta B, não há ciclo.
  2. Transações curtas: nada de chamar API externa com transação aberta.
  3. Índices nos filtros de UPDATE/DELETE: sem índice, o InnoDB trava muito mais linhas (e intervalos) do que precisa.
  4. Lotes pequenos: apague 1 milhão de linhas em blocos de 5.000.
  5. READ COMMITTED reduz gap locks, se a aplicação aceitar.
  6. Repetir a transação: deadlock ocasional é normal; a aplicação deve tentar de novo.
  7. ALTER TABLE online com ALGORITHM=INPLACE, LOCK=NONE e, 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

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).