Deadlock encontrado / tempo de espera por lock esgotado
Duas coisas tentaram salvar o mesmo registro no mesmo momento e o banco cancelou uma.
Faça isto primeiro
De vez em quando é normal. Se acontece o tempo todo, algum script está salvando muito mais do que deveria.
O que significa
Duas transações têm cada uma uma linha que a outra quer. O MySQL mata uma para que a outra possa terminar: a que ele matou é o erro que você está lendo. Um tempo de espera por lock é o primo mais leve: ninguém travou em deadlock, uma consulta só esperou demais por um lock e desistiu.
Nenhum dos dois é corrupção. O banco fez a coisa certa; o código é que precisa saber lidar.
O que causa isso
Ordenado pela frequência com que é a resposta.
- 1
Dois saves para o mesmo jogador ao mesmo tempo
Um save automático e um manual competindo pela mesma linha.
- 2
Linhas travadas em ordens diferentes
Um caminho do código atualiza o usuário e depois o veículo, outro o veículo e depois o usuário. Esse é o deadlock de manual.
- 3
Uma transação longa segurando locks
Uma transação aberta, algo lento feito dentro dela, e só depois confirmada.
- 4
Um UPDATE em massa no horário de pico
Um pagamento geral ou um wipe tocando cada linha enquanto os jogadores também estão sendo salvos.
- 5
Índices faltando que alargam o lock
Sem um índice, um UPDATE trava muito mais linhas do que precisa.
Como saber qual é o seu
SHOW ENGINE INNODB STATUS;
A seção LATEST DETECTED DEADLOCK nomeia as duas transações e as duas instruções, o que costuma ser o diagnóstico inteiro.
Onde olhar
As duas instruções que o InnoDB nomeia, e se elas tocam as mesmas tabelas em ordens diferentes.
Como consertar
Trave numa ordem consistente em todo lugar, mantenha as transações curtas, indexe o que você filtra, e tente de novo uma vez num deadlock em vez de dar a operação por perdida:
CREATE INDEX idx_users_identifier ON users (identifier);
Um deadlock é um erro que se pode repetir por design: a segunda tentativa normalmente dá certo porque a transação em conflito já terminou.
Ainda travado no seu próprio código?
Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.
bug_reportAbrir o Server FixerPara esse tipo de erro, o Script Optimizer detecta os padrões de consulta que causam isso.