Pregunta

Sé que los puntos muertos ocurren inevitablemente cuando se usan transacciones en Innodb y que son inofensivos si el código de la aplicación los trata adecuadamente, "solo inténtalo de nuevo", como dice el manual.

Entonces me preguntaba: ¿cómo se detectan los puntos muertos? ¿Un punto muerto emite algún número especial de error mysql? Estoy usando la extensión mysqli de PHP si eso importa.

Gracias.

Editar: solución encontrada, ver comentarios

¿Fue útil?

Solución

http://dev.mysql.com/ doc / refman / 5.0 / es / innodb-error-codes.html

  

1213 (ER_LOCK_DEADLOCK)

     

Punto muerto de transacción. Deberías volver a ejecutar   la transacción.

Otros consejos

" MOSTRAR ESTADO INNODB DEL MOTOR " desde el cliente de línea de comandos MySQL (no un navegador de consulta) le dará información sobre puntos muertos.

Los puntos muertos también pueden ser causados ??por transacciones no confirmadas (generalmente errores de programa) y la persona que ejecuta la transacción no confirmada no verá el problema, ya que funcionará bien (a través de sus datos no se comprometerá).

Pruebe MaatKit . Tiene un registrador de punto muerto.

Intente usar MONyog . Habilite MONyog's " Deadlock Monitoring " opción para rastrear los puntos muertos informados por INNODB STATUS. MONyog enviará una alerta al usuario cuando ocurra un nuevo punto muerto. ingrese la descripción de la imagen aquí

Pruebe innotop, detectará el punto muerto por usted.

Si estás en una Mac:

$ brew install percona-toolkit

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

Recientemente creé una comprobación muy simple de puntos muertos para la implementación de una prueba de humo de una aplicación web. El código se puede mejorar mucho, pero está funcionando por ahora. Consulte https://dev.mysql.com/doc /refman/8.0/en/innodb-standard-monitor.html para obtener más información sobre el resultado de la consulta utilizada a continuación.

$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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top