So identifizieren Sie die spezifische Abfrage, die die Sperre gehalten hat, wenn in MySQL ein Fehler auftritt, der das Sperrwartezeitlimit überschritten hat
Einführung:
Der Fehler „Wartezeit für Sperre überschritten“ in MySQL weist darauf hin, dass eine Abfrage beim Versuch, auf eine gesperrte Ressource zuzugreifen, auf eine Zeitüberschreitung beim Warten auf Sperre gestoßen ist. Dies kann in Szenarien auftreten, in denen mehrere Abfragen auf dieselben Daten zugreifen und eine Abfrage aufgrund einer widersprüchlichen Sperre die Ausführung einer anderen blockiert. Das Bestimmen der spezifischen Abfrage, die das Warten auf die Sperre verursacht, kann dabei helfen, das Problem zu lösen und zukünftige Vorkommnisse zu verhindern.
Identifizieren der verantwortlichen Abfrage:
Im Fehlerprotokoll steht das Wort „ „Transaktion“ ist ein Schlüsselindikator dafür, dass die Abfrage, die versucht, auf die Datenbank zuzugreifen, eine oder mehrere InnoDB-Tabellen ändert. Wenn man die Abfrage kennt, die den Fehler ausgelöst hat, ist es möglich, die betroffenen Tabellen zu identifizieren.
Mit dem Befehl SHOW ENGINE INNODB STATUSG können Sie Informationen über die betroffenen Tabellen und den Sperrstatus erhalten. Dieser Befehl zeigt detaillierte Informationen an, einschließlich:
Beispielausgabe:
Die folgende Ausgabe von SHOW ENGINE INNODB STATUSG zeigt, dass eine bestimmte Abfrage vorliegt wartet auf eine exklusive Sperre für den Anhang Tabelle:
RW-excl spins: 787046, OS waits: 39353 ... Latest foreign key error (a full list is printed in the InnoDB error log when a foreign key error occurs): ... Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 ... Foreign key constraint fails for table `backoffice`.`attachment`: , CONSTRAINT `attachment_ibfk_2` FOREIGN KEY (`file_id`) REFERENCES `file` (`file_id`) Trying to delete or update in parent table, in index `PRIMARY` tuple: ... But in child table `backoffice`.`attachment`, in index `PRIMARY`, there is a record:
Lösung:
Um das Problem zu beheben, können Sie den Wert des Parameters innodb_lock_wait_timeout erhöhen, der die maximale Zeit angibt, die eine Transaktion warten soll eine Sperre, bevor ein Fehler gemeldet wird. Durch Erhöhen dieses Timeouts können Sie mehr Pufferzeit für den Abschluss von Transaktionen bereitstellen und die Wahrscheinlichkeit von Sperr-Timeout-Fehlern verringern.
innodb_lock_wait_timeout festlegen:
Um das Timeout dauerhaft festzulegen, fügen Sie die folgende Zeile zu /etc/my.cnf hinzu und starten Sie neu MySQL:
[mysqld] innodb_lock_wait_timeout=120
Um das Timeout für die aktuelle Sitzung festzulegen, führen Sie die folgende Abfrage aus:
SET GLOBAL innodb_lock_wait_timeout = 120;
Das obige ist der detaillierte Inhalt vonWie identifiziere ich die spezifische Abfrage, die den Fehler „Wartezeit für Sperre überschritten' in MySQL verursacht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!