Inhaltsverzeichnis
Zitat:
Das Problem entsteht:
Problemanalyse:
Heim Datenbank MySQL-Tutorial Verstehen Sie das Sperrproblem der MySQL-Einfügung in ... select

Verstehen Sie das Sperrproblem der MySQL-Einfügung in ... select

Oct 12, 2020 pm 06:00 PM
mysql

MySQL-TutorialIn dieser Spalte wird das Sperrproblem beim Einfügen von MySQL in ... select vorgestellt.

Verstehen Sie das Sperrproblem der MySQL-Einfügung in ... select

Zitat:

Ich bin kürzlich auf ein Datenbank-Deadlock-Problem gestoßen. Hier ist eine Aufzeichnung des Lösungsprozesses.

Das Problem entsteht:

Es gibt mehrere Ereignisse in MySQL im System, die alle paar Minuten für Funktionen wie statistische Daten ausgeführt werden, und dann schreibt dieses Ereignis Daten in eine Tabelle. Allgemeiner Inhalt: in a ersetzen aus Pflichtfelder aus b auswählen; Die allgemeine Struktur ist wie folgt: Das von „select from b“ benötigte Feld ist tatsächlich sehr kompliziert und umfasst viele Tabellenverknüpfungsoperationen. Dann wird dieses Ereignis einmal pro Minute ausgeführt, wenn die Datenmenge groß ist Es kann sein, dass es nicht in einer Minute abgeschlossen ist. Dann müssen wir verschiedene andere Einfüge- und Aktualisierungsvorgänge für Tabelle b durchführen. Zu diesem Zeitpunkt werden Sie feststellen, dass in den Backend-Protokollen häufig Deadlock- und Wait-Lock-Timeout-Fehler auftreten. Der letzte Test ergab, dass das Problem durch das Ausschalten des Ereignisses behoben wurde, und es wurde im Wesentlichen bestätigt, dass das Problem bei diesem Ereignis lag.

Problemanalyse:

Tatsächlich war es am zeitaufwändigsten, herauszufinden, dass es sich um ein Ereignisproblem handelte. Es dauerte nicht lange, die Daten abzufragen und das Problem zu lösen. 1. Finden Sie zunächst anhand der Fehlerinformationen im Back-End-Protokoll heraus, welche Tabelle den Deadlock verursacht hat und welche Tabelle auf die Zeitüberschreitung der Sperre gewartet hat. 2. Anschließend haben wir anhand dieser Tabellennamen und der gedruckten SQL herausgefunden, wo Das Problem könnte sein, es wurde grob bestätigt, dass es durch die SQL im Ereignis verursacht wurde. Nach dem Ausschalten des Ereignisses stellten wir fest, dass es kein Sperrproblem im Protokoll gab In der Anweisung haben wir festgestellt, dass es sich wahrscheinlich um ein Feld aus b handelt;

Der Hauptgrund hierfür ist, dass nicht klar ist, in welchen Situationen MySQL gesperrt wird Wenden Sie nur eine gemeinsame Sperre an, und für Vorgänge wie das Einfügen und Aktualisieren der B-Tabelle wird eine exklusive Sperre angewendet. Diese beiden sind kompatibel, einer liest und einer schreibt, und es gibt keinen Konflikt. Aber dem Timeout-Phänomen nach zu urteilen, scheint es, dass die für select from b erforderlichen Felder auch die b-Tabelle sperren. Sowohl Einfügungen als auch Aktualisierungen warten also auf die Sperre.

Endlich habe ich in Stack Overflow einige interessante Informationen und Linkadressen gefunden. Hier heißt es, dass es auf die Ebene „read-committed“ eingestellt werden muss. Dann wird auch ein MySQL-Konfigurationsparameter eingeführt: innodb_locks_unsafe_for_binlog.

Also sind wir diesen Informationen gefolgt, um sie auf der offiziellen Website zu überprüfen, und haben diesen Absatz gefunden:

INSERT INTO T SELECT ... FROM S WHERE ... sets an exclusive index record lock (without a gap lock) on each row inserted into T. If the transaction isolation level is READ COMMITTED, or innodb_locks_unsafe_for_binlog is enabled and the transaction isolation level is not SERIALIZABLE, InnoDB does the search on S as a consistent read (no locks). Otherwise, InnoDB sets shared next-key locks on rows from S. InnoDB has to set locks in the latter case: During roll-forward recovery using a statement-based binary log, every SQL statement must be executed in exactly the same way it was done originally.复制代码
Nach dem Login kopieren

Das bedeutet, dass für INSERT INTO T SELECT ... FROM S WHERE ... In diesem Fall zunächst einmal wer ist Typ auf dem T-Tisch? Datensatzsperren (Sperren auf Zeilenebene) ohne Lückensperren. Für Tabelle S gibt es zwei Situationen, in denen keine Sperre gesperrt wird:

1. Wenn die Transaktionsisolationsstufe READ COMMITTED ist.

2. Oder innodb_locks_unsafe_for_binlog ist aktiviert und die Transaktionsisolationsstufe ist nicht SERIALIZABLE Reihe von S-Next-Taste. Wenn Sie sich bei next-key nicht sicher sind, können Sie diese Einführung und die Linkadresse auf der offiziellen Website lesen.


Die Art und Weise, wie wir das Warte-Timeout lösen wollen, ist relativ klar, nämlich zu verhindern, dass die S-Tabelle gesperrt wird. Um jedoch eine Sperre zu vermeiden, können wir die beiden auf der offiziellen Website genannten Methoden verwenden. Beides ist möglich, aber gemäß der Einführung des Parameters innodb_locks_unsafe_for_binlog ist es am besten, Methode 1 zu verwenden und die Transaktionsisolationsstufe auf „read-committed“ zu setzen.

Die Gründe sind wie folgt:

1. Der Parameter innodb_locks_unsafe_for_binlog ist statisch. Sie müssen eine Zeile innodb_locks_unsafe_for_binlog = 1 zu my.cnf hinzufügen und dann die Datenbank neu starten. Geben Sie den Befehl in MySQL ein:

show variables like "%innodb_locks_unsafe_for_binlog%"复制代码
Nach dem Login kopieren

Wenn festgestellt wird, dass es eingeschaltet ist, wurde es erfolgreich aktiviert.

2. Die Isolationsstufe einer Transaktion ist relativ feinkörnig und kann für eine bestimmte Sitzung festgelegt werden. Verschiedene Sitzungen können unterschiedliche Isolationsstufen verwenden. Dieser Parameter ist dynamisch und kann direkt in der MySQL-Befehlszeile geändert werden.

3. Die Parametereinführung von mysql5.7 besagt, dass der Parameter innodb_locks_unsafe_for_binlog in nachfolgenden MySQL-Versionen aufgegeben wird. Das stimmt. Ich habe die detaillierte Parametererklärung von mysql8.0 überprüft und festgestellt, dass dieser Parameter nicht mehr existiert.

Es wird daher empfohlen, zur Kontrolle die Transaktionsisolationsstufe zu verwenden.



Weitere verwandte kostenlose Lernempfehlungen:

MySQL-Tutorial

(Video)

Das obige ist der detaillierte Inhalt vonVerstehen Sie das Sperrproblem der MySQL-Einfügung in ... select. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie man phpmyadmin öffnet Wie man phpmyadmin öffnet Apr 10, 2025 pm 10:51 PM

Sie können PhpMyAdmin in den folgenden Schritten öffnen: 1. Melden Sie sich beim Website -Bedienfeld an; 2. Finden und klicken Sie auf das Symbol phpmyadmin. 3. Geben Sie MySQL -Anmeldeinformationen ein; 4. Klicken Sie auf "Login".

MySQL: Eine Einführung in die beliebteste Datenbank der Welt MySQL: Eine Einführung in die beliebteste Datenbank der Welt Apr 12, 2025 am 12:18 AM

MySQL ist ein Open Source Relational Database Management -System, das hauptsächlich zum schnellen und zuverlässigen Speicher und Abrufen von Daten verwendet wird. Sein Arbeitsprinzip umfasst Kundenanfragen, Abfragebedingungen, Ausführung von Abfragen und Rückgabergebnissen. Beispiele für die Nutzung sind das Erstellen von Tabellen, das Einsetzen und Abfragen von Daten sowie erweiterte Funktionen wie Join -Operationen. Häufige Fehler umfassen SQL -Syntax, Datentypen und Berechtigungen sowie Optimierungsvorschläge umfassen die Verwendung von Indizes, optimierte Abfragen und die Partitionierung von Tabellen.

So verwenden Sie ein einzelnes Gewinde -Redis So verwenden Sie ein einzelnes Gewinde -Redis Apr 10, 2025 pm 07:12 PM

Redis verwendet eine einzelne Gewindearchitektur, um hohe Leistung, Einfachheit und Konsistenz zu bieten. Es wird E/A-Multiplexing, Ereignisschleifen, nicht blockierende E/A und gemeinsame Speicher verwendet, um die Parallelität zu verbessern, jedoch mit Einschränkungen von Gleichzeitbeschränkungen, einem einzelnen Ausfallpunkt und ungeeigneter Schreib-intensiver Workloads.

Warum MySQL verwenden? Vorteile und Vorteile Warum MySQL verwenden? Vorteile und Vorteile Apr 12, 2025 am 12:17 AM

MySQL wird für seine Leistung, Zuverlässigkeit, Benutzerfreundlichkeit und Unterstützung der Gemeinschaft ausgewählt. 1.MYSQL bietet effiziente Datenspeicher- und Abruffunktionen, die mehrere Datentypen und erweiterte Abfragevorgänge unterstützen. 2. Übernehmen Sie die Architektur der Client-Server und mehrere Speichermotoren, um die Transaktion und die Abfrageoptimierung zu unterstützen. 3. Einfach zu bedienend unterstützt eine Vielzahl von Betriebssystemen und Programmiersprachen. V.

Mysqls Platz: Datenbanken und Programmierung Mysqls Platz: Datenbanken und Programmierung Apr 13, 2025 am 12:18 AM

Die Position von MySQL in Datenbanken und Programmierung ist sehr wichtig. Es handelt sich um ein Open -Source -Verwaltungssystem für relationale Datenbankverwaltung, das in verschiedenen Anwendungsszenarien häufig verwendet wird. 1) MySQL bietet effiziente Datenspeicher-, Organisations- und Abruffunktionen und unterstützt Systeme für Web-, Mobil- und Unternehmensebene. 2) Es verwendet eine Client-Server-Architektur, unterstützt mehrere Speichermotoren und Indexoptimierung. 3) Zu den grundlegenden Verwendungen gehören das Erstellen von Tabellen und das Einfügen von Daten, und erweiterte Verwendungen beinhalten Multi-Table-Verknüpfungen und komplexe Abfragen. 4) Häufig gestellte Fragen wie SQL -Syntaxfehler und Leistungsprobleme können durch den Befehl erklären und langsam abfragen. 5) Die Leistungsoptimierungsmethoden umfassen die rationale Verwendung von Indizes, eine optimierte Abfrage und die Verwendung von Caches. Zu den Best Practices gehört die Verwendung von Transaktionen und vorbereiteten Staten

Überwachen Sie Redis Tröpfchen mit Redis Exporteur Service Überwachen Sie Redis Tröpfchen mit Redis Exporteur Service Apr 10, 2025 pm 01:36 PM

Eine effektive Überwachung von Redis -Datenbanken ist entscheidend für die Aufrechterhaltung einer optimalen Leistung, die Identifizierung potenzieller Engpässe und die Gewährleistung der Zuverlässigkeit des Gesamtsystems. Redis Exporteur Service ist ein leistungsstarkes Dienstprogramm zur Überwachung von Redis -Datenbanken mithilfe von Prometheus. In diesem Tutorial führt Sie die vollständige Setup und Konfiguration des Redis -Exporteur -Dienstes, um sicherzustellen, dass Sie nahtlos Überwachungslösungen erstellen. Durch das Studium dieses Tutorials erhalten Sie voll funktionsfähige Überwachungseinstellungen

So sehen Sie sich den SQL -Datenbankfehler an So sehen Sie sich den SQL -Datenbankfehler an Apr 10, 2025 pm 12:09 PM

Die Methoden zum Anzeigen von SQL -Datenbankfehlern sind: 1. Fehlermeldungen direkt anzeigen; 2. Verwenden Sie Showfehler und Warnungsbefehle anzeigen; 3.. Greifen Sie auf das Fehlerprotokoll zu. 4. Verwenden Sie Fehlercodes, um die Ursache des Fehlers zu finden. 5. Überprüfen Sie die Datenbankverbindung und die Abfrage -Syntax. 6. Verwenden Sie Debugging -Tools.

So stellen Sie eine Verbindung zur Datenbank von Apache her So stellen Sie eine Verbindung zur Datenbank von Apache her Apr 13, 2025 pm 01:03 PM

Apache verbindet eine Verbindung zu einer Datenbank erfordert die folgenden Schritte: Installieren Sie den Datenbanktreiber. Konfigurieren Sie die Datei web.xml, um einen Verbindungspool zu erstellen. Erstellen Sie eine JDBC -Datenquelle und geben Sie die Verbindungseinstellungen an. Verwenden Sie die JDBC -API, um über den Java -Code auf die Datenbank zuzugreifen, einschließlich Verbindungen, Erstellen von Anweisungen, Bindungsparametern, Ausführung von Abfragen oder Aktualisierungen und Verarbeitungsergebnissen.

See all articles