Pergunta

Eu sei que impasses ocorrem inevitavelmente ao usar transações no InnoDB e que eles são inofensivos se forem tratados adequadamente pelo código do aplicativo -. "Apenas experimentá-lo novamente", como diz o manual

Então eu queria saber - como você detectar bloqueios? Será que um impasse emitir um número de erro mysql especial? Eu estou usando a extensão mysqli do PHP se o que importa.

Obrigado.

Editar: solução encontrada, ver os comentários

Foi útil?

Solução

http://dev.mysql.com/ doc / refman / 5.0 / en / InnoDB-error-codes.html

1213 (ER_LOCK_DEADLOCK)

impasse Transação. Você deve executar novamente a transação.

Outras dicas

"Show de INNODB STATUS" do cliente de linha de comando mysql (não um navegador consulta) vai lhe dar informações sobre impasses.

Deadlocks também podem ser causados ??por transações não confirmadas (geralmente erros de programa) e a pessoa que está executando a transação não confirmada não vai ver o problema como eles vão estar funcionando bem (através dos seus dados não serão comprometidos).

Tente Maatkit . Ele tem um logger impasse.

Tente usar MONyog . Ativar opção de MONyog "Impasse Monitoring" para rastrear os impasses relatados por INNODB STATUS. MONyog enviará um alerta ao usuário quando ocorrer um novo impasse. enter descrição da imagem aqui

Tente innotop, irá detectar o impasse para você.

Se você estiver em um Mac:

$ bebida instalar Percona-toolkit

$ pt-impasse-logger -uroot ask-pass localhost

Recentemente criou uma verificação muito simples para os impasses para a implementação de um teste de fumaça de um applciation web. Código pode ser melhorado muito, mas ele está trabalhando para agora. Consulte https://dev.mysql.com/doc /refman/8.0/en/innodb-standard-monitor.html para mais informações sobre a saída da consulta usada abaixo.

$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;

if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
  trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}

if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
  trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top