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:
|
<<: Shell-Skript Nginx-Automatisierungsskript
1. Verwenden Sie Daten aus Tabelle A, um den Inha...
Inhaltsverzeichnis 1. CentOS7+MySQL8.0, Yum-Quell...
Haftungsausschluss: Mit dieser Methode zum Zurück...
Der Excel-Export schlägt in der Docker-Umgebung i...
Hintergrund: Einige Experimente müssen auf dem Se...
Vorwort Dieser Artikel stellt hauptsächlich den r...
1. Verwenden Sie grundlegende Textelemente, um In...
Innodb umfasst die folgenden Komponenten 1. innod...
Inhaltsverzeichnis Vorwort Vorteile der Axios-Kap...
Grundlegende Umgebung Pagoden-Montageservice [Pyt...
Vorwort Wenn ein 403-Cross-Origin-Fehler auftritt...
Wir müssen lediglich einen beliebigen Texteditor ö...
Der folgende Befehl wird häufig verwendet: chmod ...
Die bedeutendste Website-Änderung im Jahr 2011 bet...
Warum? Am einfachsten lässt es sich so ausdrücken:...