devterview_$ iniciar simulação

Cenário: deadlock intermitente no InnoDB

DifícilSêniorTransações

Pergunta

Sua aplicação recebe 'Deadlock found when trying to get lock' de vez em quando no MySQL. O que causa e como reduzir?

Resposta esperada

Deadlock: duas (ou mais) transações seguram locks que a outra precisa e ficam se esperando. O InnoDB DETECTA e mata uma delas (a com menos trabalho) com esse erro — então a app precisa fazer RETRY da transação abortada (é esperado, não um bug fatal). Causas comuns: transações que travam linhas em ORDEM DIFERENTE (T1 trava A depois B, T2 trava B depois A) — padronizar a ordem de acesso (ex: sempre por id crescente) elimina boa parte; transações longas segurando locks por muito tempo (encurtar, mover trabalho não-transacional pra fora); locks de range/gap do REPEATABLE READ pegando mais linhas do que o esperado; falta de índice fazendo um `UPDATE ... WHERE` travar linhas demais (a varredura trava o que percorre). Reduzir: ordem consistente de acesso, transações curtas, índices que restringem o que é travado, e retry com backoff no código.

Por que perguntam isso

Cenário pleno/sênior de MySQL. Sinal de experiência: 'retry é esperado, não bug', 'padronizar a ordem de acesso', e falta de índice travando linhas demais.

#deadlock#locks#innodb#retry
publicidade

Relacionadas