Tengo una tabla MySQL con aproximadamente 5,000,000 filas que constantemente se actualizan en pequeñas formas mediante procesos paralelos de Perl que se conectan a través de DBI. La tabla tiene alrededor de 10 columnas y varios índices.Error al trabajar con MySQL "Se ha encontrado un punto muerto al intentar obtener un bloqueo; intente reiniciar la transacción"
Una operación bastante común da lugar al error de seguimiento veces:
DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at Db.pm line 276.
La instrucción SQL que desencadena el error es algo como esto:
UPDATE file_table SET a_lock = 'process-1234' WHERE param1 = 'X' AND param2 = 'Y' AND param3 = 'Z' LIMIT 47
El error se dispara sólo a veces. Calculo en 1% de llamadas o menos. Sin embargo, nunca sucedió con una tabla pequeña y se ha vuelto más común a medida que la base de datos ha crecido.
Tenga en cuenta que estoy usando el campo a_lock en file_table para asegurarme de que los cuatro procesos casi idénticos que estoy ejecutando no intenten trabajar en la misma fila. El límite está diseñado para dividir su trabajo en pequeños trozos.
No he hecho mucho ajuste en MySQL o DBD :: mysql. MySQL es una implementación estándar de Solaris, y la conexión de base de datos está configurado de la siguiente manera:
my $dsn = "DBI:mysql:database=" . $DbConfig::database . ";host=${DbConfig::hostname};port=${DbConfig::port}";
my $dbh = DBI->connect($dsn, $DbConfig::username, $DbConfig::password, { RaiseError => 1, AutoCommit => 1 }) or die $DBI::errstr;
que he visto en línea que varias otras personas han informado de errores similares y que esto puede ser una situación de bloqueo genuino.
Tengo dos preguntas:
¿Qué es exactamente mi situación está causando el error anterior?
¿Hay una manera simple de evitarlo o disminuir su frecuencia? Por ejemplo, ¿cómo hago para "reiniciar la transacción en Db.pm línea 276"?
Gracias de antemano.
¿Cuáles son los códigos de error que necesitamos detectar entonces? ¿Capturar solo a 1205 es suficiente? Hay más de 900 códigos de error en http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html. ¿Cómo sabe todos los códigos que debemos detectar para implementar una solución adecuada para su sugerencia de prueba/captura? – Pacerier
¿Significa esto que aparte de 'InnoDB o cualquier RDBMS transaccional a nivel de fila' no tiene estos problemas? –