THE ORB
Iniciando o studio

Deadlock encontrado / tempo de espera por lock esgotado

Duas coisas tentaram salvar o mesmo registro no mesmo momento e o banco cancelou uma.

groupsAlgum salvamento falho de vez em quandocodePrecisa de um desenvolvedor

Faça isto primeiro

De vez em quando é normal. Se acontece o tempo todo, algum script está salvando muito mais do que deveria.

bug_reportMelhor colar o console inteiro

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

    Dois saves para o mesmo jogador ao mesmo tempo

    Um save automático e um manual competindo pela mesma linha.

  2. 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. 3

    Uma transação longa segurando locks

    Uma transação aberta, algo lento feito dentro dela, e só depois confirmada.

  4. 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. 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 Fixer

Para esse tipo de erro, o Script Optimizer detecta os padrões de consulta que causam isso.

Erros que andam junto com este