Wenn Sie gerade eine große Abfrage beendet haben, wird es einige Zeit dauern, bis rollback
. Wenn Sie eine weitere Abfrage durchführen, bevor die abgebrochene Abfrage zurückgesetzt wurde, kann ein Fehler wegen Zeitüberschreitung der Sperre auftreten. Genau das ist mir passiert. Die Lösung war, einfach ein bisschen zu warten.
Einzelheiten:
Ich hatte eine DELETE-Abfrage gestellt, um etwa 900.000 von etwa 1 Million Zeilen zu entfernen.
Ich habe dies versehentlich durchgeführt (nur 10 % der Zeilen wurden entfernt): DELETE FROM table WHERE MOD(id,10) = 0
Stattdessen (90% der Zeilen werden entfernt): DELETE FROM table WHERE MOD(id,10) != 0
Ich wollte 90 % der Zeilen entfernen, nicht 10 %. Also beendete ich den Prozess in der MySQL-Befehlszeile, wohl wissend, dass er alle bis dahin gelöschten Zeilen zurücknehmen würde.
Dann führte ich sofort den richtigen Befehl aus und erhielt eine lock timeout exceeded
Fehler bald darauf. Mir wurde klar, dass die Sperre in Wirklichkeit die rollback
der getöteten Abfrage noch im Hintergrund abläuft. Also wartete ich ein paar Sekunden und führte die Abfrage erneut aus.