Heim >Datenbank >MySQL-Tutorial >Wie kann ich die Fehlermeldung „Deadlock beim Versuch, eine Sperre zu erhalten' in meinem MySQL-Online-Benutzerverfolgungssystem verhindern?

Wie kann ich die Fehlermeldung „Deadlock beim Versuch, eine Sperre zu erhalten' in meinem MySQL-Online-Benutzerverfolgungssystem verhindern?

Linda Hamilton
Linda HamiltonOriginal
2024-12-15 18:52:15312Durchsuche

How Can I Prevent

Vermeiden von „Deadlock beim Versuch, eine Sperre zu erhalten“ in MySQL

Problem:

Ein Entwickler stößt zeitweise auf „Deadlock gefunden, als er versucht, eine Sperre zu erhalten; Versuchen Sie, die Transaktion neu zu starten. Fehler beim Ausführen von INSERTs in einer InnoDB-Tabelle, die Online-Benutzeraktivitäten verfolgt. Die Tabelle wird bei der Seitenaktualisierung aktualisiert und alle 15 Minuten durch einen Cronjob gelöscht.

Fragen in Frage:

  • Erster Besuch: INSERT INTO onlineusers (ip , Datum/Uhrzeit, Benutzer-ID, Seite, Bereich, Typ) VALUES (ip, now(), Benutzer-ID, '/thispage', 'thisarea', 3)
  • Seitenaktualisierung: UPDATE onlineusers SET ip = ip, datetime = now(), userid = userid, page = '/thispage', area = 'thisarea', type = 3 WHERE id = 888
  • Cron-Job alle 15 Minuten: DELETE FROM onlineusers WHERE datetime <= now() – INTERVAL 900 ZWEITER

Lösung:

Um Deadlocks zu beheben, ist es wichtig sicherzustellen, dass Transaktionen Sperrschlüssel in einer konsistenten Reihenfolge sperren. Hier sind die empfohlenen Schritte:

  1. Schlüssel in Abfragen anordnen:

    • Stellen Sie sicher, dass alle Abfragen, die mehrere Schlüssel sperren, in aufsteigender Reihenfolge erfolgen Reihenfolge für die Schlüssel.
  2. Sortieren Löschen Anweisungen:

    • Ändern Sie die DELETE-Anweisung so, dass sie eine Unterabfrage enthält, die die Primärschlüsselwerte (in diesem Fall die ID) in aufsteigender Reihenfolge abruft, etwa so:
    DELETE FROM onlineusers
    WHERE id IN (
        SELECT id
        FROM onlineusers
        WHERE datetime <= now() - INTERVAL 900 SECOND
        ORDER BY id
    ) u;
  3. Erneut versuchen Mechanismus:

    • Erwägen Sie die Implementierung eines Wiederholungsmechanismus im Client-Code für diesen spezifischen Fehler, der es ihm ermöglicht, automatisch eine begrenzte Anzahl von Wiederholungen durchzuführen.

Das obige ist der detaillierte Inhalt vonWie kann ich die Fehlermeldung „Deadlock beim Versuch, eine Sperre zu erhalten' in meinem MySQL-Online-Benutzerverfolgungssystem verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn