THE ORB
Studio wird gestartet

Deadlock gefunden / Wartezeit auf Sperre überschritten

Zwei Dinge wollten denselben Datensatz gleichzeitig speichern, und die Datenbank hat eines abgebrochen.

groupsGelegentlich ein fehlgeschlagener SpeichervorgangcodeBraucht einen Entwickler

Mach das zuerst

Gelegentlich ist das normal. Wenn es ständig passiert, speichert ein Script viel zu oft.

bug_reportFüg lieber deine ganze Konsole ein

Was es bedeutet

Zwei Transaktionen halten jeweils eine Zeile, die die andere will. MySQL tötet eine, damit die andere fertig wird — die getötete ist der Fehler, den du liest. Eine Sperr-Zeitüberschreitung ist der mildere Vetter: Niemand ist verklemmt, eine Abfrage hat nur zu lange auf eine Sperre gewartet und aufgegeben.

Keines von beidem ist Datenverlust. Die Datenbank hat richtig gehandelt; der Code muss damit umgehen können.

Was es auslöst

Sortiert danach, wie oft es die Antwort ist.

  1. 1

    Zwei Speichervorgänge für denselben Spieler gleichzeitig

    Ein Autosave und ein manuelles Speichern im Wettlauf um dieselbe Zeile.

  2. 2

    Zeilen in unterschiedlicher Reihenfolge gesperrt

    Ein Codeweg aktualisiert erst den Benutzer, dann das Fahrzeug, ein anderer erst das Fahrzeug, dann den Benutzer. Das ist der Lehrbuch-Deadlock.

  3. 3

    Eine lange Transaktion, die Sperren hält

    Eine Transaktion geöffnet, darin etwas Langsames erledigt, dann committet.

  4. 4

    Ein Massen-UPDATE zur Stoßzeit

    Ein Zahltag oder ein Wipe, der jede Zeile anfasst, während auch Spieler gespeichert werden.

  5. 5

    Fehlende Indizes, die die Sperre ausweiten

    Ohne Index sperrt ein UPDATE weit mehr Zeilen, als es müsste.

Wie du erkennst, welcher deiner ist

SHOW ENGINE INNODB STATUS;

Der Abschnitt LATEST DETECTED DEADLOCK nennt beide Transaktionen und beide Anweisungen — meist ist das schon die ganze Diagnose.

Wo du nachsehen musst

Die beiden von InnoDB genannten Anweisungen, und ob sie dieselben Tabellen in unterschiedlicher Reihenfolge anfassen.

Wie du es behebst

Sperr überall in derselben Reihenfolge, halte Transaktionen kurz, indiziere, wonach du filterst, und wiederhol bei einem Deadlock einmal, statt die Operation scheitern zu lassen:

CREATE INDEX idx_users_identifier ON users (identifier);

Ein Deadlock ist von Natur aus ein wiederholbarer Fehler — der zweite Versuch gelingt meist, weil die konkurrierende Transaktion inzwischen fertig ist.

Hängst du immer noch an deinem eigenen Code?

Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.

bug_reportServer Fixer öffnen

Für diese Art Fehler Script Optimizer erkennt die Abfragemuster, die das verursachen.

Fehler, die mit diesem zusammen auftreten