Ich habe eine MySQL-Tabelle mit etwa 5.000.000 Zeilen, die ständig in kleinen Wegen durch parallele Perl-Prozesse via DBI-Verbindung aktualisiert werden. Die Tabelle hat ungefähr 10 Spalten und mehrere Indizes.Um MySQL-Fehler zu arbeiten "Deadlock gefunden, wenn versucht, Sperre zu bekommen; versuchen, Transaktion neu zu starten"
Eine recht häufige Operation führt zu folgendem Fehler manchmal:
DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at Db.pm line 276.
Die SQL-Anweisung, die den Fehler auslöst, ist so etwas wie dieses:
UPDATE file_table SET a_lock = 'process-1234' WHERE param1 = 'X' AND param2 = 'Y' AND param3 = 'Z' LIMIT 47
Der Fehler nur manchmal ausgelöst wird. Ich würde in 1% der Anrufe oder weniger schätzen. Es ist jedoch nie mit einer kleinen Tabelle passiert und ist häufiger geworden, als die Datenbank gewachsen ist.
Beachten Sie, dass ich das a_lock-Feld in file_table verwende, um sicherzustellen, dass die vier nahezu identischen Prozesse, die ich ausführe, nicht versuchen, in derselben Zeile zu arbeiten. Das Limit ist darauf ausgelegt, ihre Arbeit in kleine Stücke zu zerlegen.
Ich habe nicht viel Tuning auf MySQL oder DBD :: MySQL gemacht. MySQL ist eine Standard-Solaris-Implementierung und die Datenbankverbindung wird wie folgt festgelegt:
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;
Ich habe online gesehen, dass mehrere andere Menschen Ähnliche Fehler gemeldet haben, und dass dies eine echte Deadlock-Situation sein.
Ich habe zwei Fragen:
Was genau über meine Situation über den Fehler verursacht?
Gibt es einen einfachen Weg, um es zu umgehen oder seine Frequenz zu verringern? Zum Beispiel, wie genau gehe ich "Neustart der Transaktion bei Db.pm Linie 276"?
Vielen Dank im Voraus.
Was sind die Fehlercodes, die wir dann fangen müssen? Fängt 1205 allein ausreicht? Es gibt über 900 Fehlercodes in http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html. Woher wissen Sie alle Codes, die wir fangen müssen, um eine richtige Lösung für Ihren Versuch/Fang-Vorschlag zu implementieren? – Pacerier
Bedeutet dies, dass andere als "InnoDB oder irgendein Transaktions-RDBMS auf Zeilenebene" diese Probleme nicht haben? –