MySQL-Fehler: Beim Versuch, eine Sperre zu erhalten, wurde ein Deadlock festgestellt. Versuchen Sie, die Transaktionslösung neu zu starten.

MySQL-Fehler: Beim Versuch, eine Sperre zu erhalten, wurde ein Deadlock festgestellt. Versuchen Sie, die Transaktionslösung neu zu starten.

Finden Sie das Problem

Als ich kürzlich die vorherigen Daten eingab, meldete das Programm plötzlich folgenden Fehler:

[2017-02-10 13:12:06.678] [INFO] mysqlLog - update tbl_playerdata_error: { [Fehler: ER_LOCK_DEADLOCK: Beim Versuch, eine Sperre zu erhalten, wurde ein Deadlock gefunden. Versuchen Sie, die Transaktion neu zu starten.]
 Code: 'ER_LOCK_DEADLOCK',
 Fehlernummer: 1213,
 sqlState: "40001",
 Index: 0 }

Auf den ersten Blick ist es offensichtlich, dass MySQL ein Deadlock-Problem hat. Tatsächlich läuft das oben ausgeführte Programm schon seit langem ohne Probleme auf dem Testserver. Warum tritt das MySQL-Deadlock-Problem auf dem offiziellen Server auf? Die erste Reaktion ist, dass die Datenmenge zu groß ist (mehr als 3 Millionen Datensätze), aber das ist unmöglich. Außerdem, was hat der Deadlock mit diesen Dingen zu tun? Es scheint, dass ich es richtig lösen muss.

Problemanalyse

Meine Analyse lautet: Da wir jetzt die Daten des offiziellen Servers verarbeiten und viele Benutzer auf dem offiziellen Server arbeiten, sollte es bei Abfragen oder anderen Vorgängen des Benutzers zu einem Deadlock bei der Datenaktualisierung auf meiner Seite kommen (zunächst werde ich erklären, dass ich die InnoDB-Speicher-Engine verwende. Da die Abfrage oder andere Vorgänge auf der Benutzerseite die von mir benötigten Ressourcen gesperrt haben und die Aktualisierung auf meiner Seite auch einen Teil der Ressourcen für die Vorgänge des Benutzers gesperrt hat, warteten beide Seiten darauf, dass die andere Seite Ressourcen freigibt, was zu einem Deadlock führte).

Problemumgehung

Nachdem Sie den Fehlercode kennen, überprüfen Sie zunächst die MySQL-Beschreibung. Informationen zum obigen Fehler: 1213 SQLSTATE: 40001 finden Sie unter: Server-Fehlercodes und -Meldungen

Meldung: Beim Versuch, eine Sperre zu erhalten, wurde ein Deadlock festgestellt. Versuchen Sie, die Transaktion neu zu starten.

InnoDB meldet diesen Fehler, wenn eine Transaktion auf einen Deadlock stößt und automatisch zurückgesetzt wird, damit Ihre Anwendung Korrekturmaßnahmen ergreifen kann. Um diesen Fehler zu beheben, führen Sie alle Operationen in dieser Transaktion erneut aus. Ein Deadlock tritt auf, wenn Anfragen für Sperren in inkonsistenter Reihenfolge zwischen Transaktionen eingehen. Die zurückgesetzte Transaktion hat alle ihre Sperren freigegeben und die andere Transaktion kann nun alle angeforderten Sperren erhalten. Wenn Sie die zurückgesetzte Transaktion erneut ausführen, muss sie daher möglicherweise warten, bis andere Transaktionen abgeschlossen sind, aber normalerweise tritt der Deadlock nicht erneut auf. Wenn Sie häufig auf Deadlocks stoßen, sorgen Sie dafür, dass die Reihenfolge der Sperroperationen (LOCK TABLES, SELECT ... FOR UPDATE usw.) zwischen den verschiedenen Transaktionen oder Anwendungen, bei denen das Problem auftritt, konsistent ist. Weitere Informationen finden Sie in Abschnitt 14.8.5, „Deadlocks in InnoDB“.

Oben stehen zwei Sätze:

Um diesen Fehler zu beheben, führen Sie alle Vorgänge in dieser Transaktion erneut aus.<br><br>Wenn Sie häufig auf Deadlocks stoßen, sorgen Sie dafür, dass die Abfolge der Sperrvorgänge (<code class="literal">LOCK TABLES</code>, <code class="literal">SELECT ... FOR UPDATE</code> usw.) <br>zwischen den verschiedenen Transaktionen oder Anwendungen, bei denen das Problem auftritt, konsistent ist.

Diese beiden Sätze erklären auch, wie mit Deadlocks umgegangen wird. Wenn ein Deadlock-Fehler auftritt, verwende ich einen Timer, um den Vorgang erneut zu aktualisieren und so die oben genannten Probleme zu vermeiden.

Lesen Sie außerdem die Antwort auf Stack Overflow: http://stackoverflow.com/questions/2332768/how-to-avoid-mysql-deadlock-found-when-trying-to-get-lock-try-restarting-trans

Ein einfacher Trick, der bei den meisten Deadlocks helfen kann, ist das Sortieren der Vorgänge in einer bestimmten Reihenfolge.

Es kommt zu einem Deadlock, wenn zwei Transaktionen versuchen, zwei Sperren in entgegengesetzter Reihenfolge zu sperren, d. h.:

Verbindung 1: Schlösser Schlüssel(1), Schlösser Schlüssel(2);
Verbindung 2: Schlösser Schlüssel(2), Schlösser Schlüssel(1);
Wenn beide gleichzeitig laufen, sperrt Verbindung 1 den Schlüssel (1), Verbindung 2 sperrt den Schlüssel (2) und jede Verbindung wartet darauf, dass die andere den Schlüssel freigibt -> Deadlock.

Wenn Sie nun Ihre Abfragen so ändern, dass die Verbindungen die Schlüssel in der gleichen Reihenfolge sperren, also:

Verbindung 1: Schlösser Schlüssel(1), Schlösser Schlüssel(2);
Verbindung 2: Schlösser Schlüssel(1), Schlösser Schlüssel(2);
es wird unmöglich sein, einen Deadlock zu erreichen.

Deshalb schlage ich Folgendes vor:

Stellen Sie sicher, dass Sie außer der Löschanweisung keine anderen Abfragen haben, die den Zugriff auf mehr als einen Schlüssel gleichzeitig sperren. Wenn dies der Fall ist (und ich vermute, dass dies der Fall ist), ordnen Sie deren WHERE in (k1, k2, ... kn) in aufsteigender Reihenfolge an.
Korrigieren Sie Ihre Löschanweisung, damit sie in aufsteigender Reihenfolge funktioniert:
Ändern

LÖSCHEN VON Online-Benutzern, wobei datetime <= now() - INTERVALL 900 SEKUNDEN
Zu

LÖSCHEN VON Online-Benutzern, wobei ID IN (AUSWÄHLEN ID VON Online-Benutzern
 WHERE datetime <= now() - INTERVALL 900 SEKUNDEN, sortiert nach ID) u;
Außerdem sollten Sie bedenken, dass in der MySQL-Dokumentation empfohlen wird, dass der Client im Falle eines Deadlocks automatisch einen erneuten Versuch unternehmen soll. Sie können diese Logik zu Ihrem Client-Code hinzufügen. (Zum Beispiel 3 Wiederholungsversuche bei diesem bestimmten Fehler, bevor aufgegeben wird.)

Referenz: http://blog.sina.com.cn/s/blog_4acbd39c01014gsq.html

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels Ihnen bei Ihrem Studium oder Ihrer Arbeit helfen kann. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • SqlTransaction in C# - Detaillierte Erklärung von Transaktionen
  • Nur nicht-transaktionale MySQL-Datenbank (unterstützt nur MyISAM)
  • Eine kurze Einführung in Transact-SQL
  • Einführung in die Transaktionsisolationsebene von MySQL-Datenbanken (Transaction Isolation Level)
  • Transact_SQL-Handbuch
  • Häufig verwendete Transact-SQL-Skripte für SQL Server-Datenbanken (empfohlen)

<<:  Shell-Skript Nginx-Automatisierungsskript

>>:  Beispiel für die Verwendung von JSX zur Entwicklung einer Markup-Komponente (Front-End-Komponentenbildung)

Artikel empfehlen

Tutorial zum Zurücksetzen des Root-Passworts von Mac MySQL

Haftungsausschluss: Mit dieser Methode zum Zurück...

Der Excel-Export schlägt in der Docker-Umgebung immer fehl

Der Excel-Export schlägt in der Docker-Umgebung i...

Detailliertes Tutorial zum PyCharm- und SSH-Remote-Access-Server-Docker

Hintergrund: Einige Experimente müssen auf dem Se...

【HTML-Element】Detaillierte Erklärung des Tag-Textes

1. Verwenden Sie grundlegende Textelemente, um In...

Zusammenfassung wichtiger Komponenten von MySQL InnoDB

Innodb umfasst die folgenden Komponenten 1. innod...

Der eigentliche Prozess der Einbindung von Axios in das Projekt

Inhaltsverzeichnis Vorwort Vorteile der Axios-Kap...

Detailliertes Tutorial zum Bereitstellen eines Django-Projekts unter CentOS

Grundlegende Umgebung Pagoden-Montageservice [Pyt...

HTML-Code, der den Internet Explorer zum Einfrieren bringen kann

Wir müssen lediglich einen beliebigen Texteditor ö...

Allgemeine Linux-Befehle chmod zum Ändern der Dateiberechtigungen 777 und 754

Der folgende Befehl wird häufig verwendet: chmod ...

Was wir von Googles neuer Benutzeroberfläche (Bilder und Text) lernen können

Die bedeutendste Website-Änderung im Jahr 2011 bet...

Warum sind die Bilder in mobilen Web-Apps nicht klar und sehr verschwommen?

Warum? Am einfachsten lässt es sich so ausdrücken:...