Como detectar bloqueios no MySQL / InnoDB?
-
22-07-2019 - |
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
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.
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");
}