Heim  >  Artikel  >  Datenbank  >  Ein Artikel, der die Implementierung von Sperren in MySQL vorstellt

Ein Artikel, der die Implementierung von Sperren in MySQL vorstellt

PHPz
PHPzOriginal
2023-04-19 14:11:191484Durchsuche

Implementierung der MySQL-Sperre

MySQL ist ein sehr beliebtes relationales Datenbankverwaltungssystem, das die Verarbeitung vieler gleichzeitiger Benutzer und Transaktionen unterstützt. Bei hoher Parallelität ist der Sperrmechanismus in MySQL eine entscheidende Komponente. Wie man den Sperrmechanismus rational nutzt und die Parallelitätsleistung effektiv verbessert, ist ein wichtiger Teil der MySQL-Optimierung. In diesem Artikel erfahren Sie, wie Sperren in MySQL implementiert werden und wie Sie verschiedene Sperrtypen auswählen, um die Leistung zu maximieren.

Übersicht

Wenn in einer Datenbank, auf die gleichzeitig zugegriffen wird, mehrere Benutzer versuchen, gemeinsam genutzte Daten zu ändern, können verschiedene Probleme mit der Datenkonsistenz auftreten. Die häufigsten Probleme sind Lese- und Schreibkonflikte und Datenwettlaufbedingungen. Um diese Probleme zu lösen, stellt MySQL verschiedene Sperrtypen bereit, um gleichzeitigen Zugriff zu ermöglichen und gleichzeitig die Datenkonsistenz sicherzustellen.

MySQL-Sperren werden hauptsächlich in zwei Kategorien unterteilt: Gemeinsame Sperren und Exklusive Sperren. Durch gemeinsame Sperren können mehrere Benutzer gleichzeitig auf eine Ressource zugreifen. Diese Benutzer können die Ressource nur lesen, aber nicht ändern. Wenn ein Benutzer bereits über eine gemeinsame Sperre verfügt, können andere Benutzer daher die gemeinsame Sperre verwenden, um dieselbe Ressource zu lesen, sie jedoch nicht mit einer exklusiven Sperre ändern. Eine exklusive Sperre erlaubt jeweils nur einem Benutzer den Zugriff auf dieselbe Ressource, und mehrere Benutzer können die Sperre nicht gleichzeitig halten.

Implementierung von MySQL-Sperren

Zu den Implementierungsmethoden von MySQL-Sperren gehören: Tabellensperre, Zeilensperre, Seitensperre, Tupelsperre (Tupelsperre) und Lückensperre (Lückensperre) usw.

  1. Tabellensperre

Tabellensperre ist die einfachste Sperrmethode. Während des Änderungsvorgangs ist die gesamte Tabelle gesperrt. Daher können andere Benutzer nicht auf die Tabelle zugreifen, was zu einer verringerten Parallelitätsleistung führt. Dieser Sperrmechanismus kann ordnungsgemäß funktionieren, wenn die Datenmenge der Tabelle klein ist oder nur wenige gleichzeitige Zugriffe erfolgen. In großen Datenbanken oder Datenbanken mit hoher Parallelität können Tabellensperren jedoch zu Parallelitätsproblemen führen und die Systemleistung beeinträchtigen.

Die Syntax der Tabellensperre lautet wie folgt:

  • Alle Tabellen sperren: LOCK TABLES Tabellenname [AS-Alias] Sperrtyp[, Tabellenname [AS-Alias] Sperrtyp] ...
  • Entsperren: UNLOCK TABLES

Unter ihnen: lock_type kann der folgende Typ sein:

  • READ: Gemeinsame Lesesperre.
  • WRITE: Exklusive Schreibsperre.
  1. Zeilensperre

Zeilensperre ist ein effizienterer Sperrmechanismus in MySQL. Bei Änderungen an Datensätzen in der Tabelle sperrt MySQL nur Zeilen in der Tabelle, die die Bedingungen erfüllen. Andere Zugriffe auf Zeilen, die keine Sperre erfordern, sind nicht betroffen. Bei hoher Parallelität und großem Datenvolumen kann die Verwendung von Zeilensperren den Umfang und die Zeit der Sperre effektiv reduzieren und die Leistung des Systems verbessern.

In der InnoDB-Speicher-Engine ist die Zeilensperre der Standardsperrmechanismus.

Zeilensperrsyntax:

  • Transaktion öffnen: TRANSAKTION STARTEN
  • Zeilensperre: SELECT … FOR UPDATE oder UPDATE … WHERE …
  • Transaktion festschreiben: COMMIT oder ROLLBACK

Unter diesen kann SELECT … FOR UPDATE gesperrt werden und markierte Zeile, um zu verhindern, dass die Zeile durch andere Transaktionen geändert wird. Die Anweisung UPDATE ... WHERE ... kann auch eine oder mehrere Zeilen sperren, die die Bedingungen erfüllen.

  1. Seitensperre

Seitensperre ist ein Sperrmechanismus von MySQL, der die Tabelle beim Scannen der Tabelle in Seiteneinheiten sperrt. Wenn Änderungen an mehreren Datensätzen vorgenommen werden, ist die Seitensperre effektiver als die Zeilensperre, da die Seite aus mehr Zeilen besteht. Die Zeilensperre hingegen funktioniert ohnehin einzeln auf Basis einer einzelnen Zeile, sodass die Arbeit langsamer ist, wenn mehrere Zeilen geändert werden.

Wie der Name schon sagt, dient die Seitensperre dazu, die Seite während des Änderungsprozesses einer bestimmten Seite zu sperren. Die Sperre auf Seitenebene schützt nur die gesamte Seite und benachrichtigt das System, dass die Sperrung anderer Seiten die Ausführung nicht behindert andere Transaktionen. Durch das Sperren der gesamten Tabelle oder des gesamten Index einer Seite kann das Sperren zu vieler Zeilen vermieden werden, es kann jedoch auch zu Parallelitätsproblemen führen.

So verwenden Sie Seitensperren:

  • Ändern Sie den Modus der InnoDB-Speicher-Engine und setzen Sie den Festschreibungsmodus (commit_mode) auf 2, was bedeutet, dass Sperren auf Seitenebene verwendet werden.
  • Sperren und entsperren Sie Datensätze in jeder Phase der Ausführung von SQL-Befehlen.

Sie können den folgenden Befehl verwenden, um die InnoDB-Engine dazu zu bringen, Sperren auf Seitenebene zu verwenden:

  • SET GLOBAL innodb_locks_unsafe_for_binlog=1;
  • SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Bei der Verwendung von Seitensperren müssen Sie dies tun Achten Sie darauf, keine SQL-Anweisungen zu verwenden. Das LIMIT in begrenzt die Anzahl der Abfragezeilen, da dies dazu führen kann, dass die Datenbank von Sperren auf Zeilenebene zu Sperren auf Tabellenebene wechselt.

  1. Tupelsperre

Tupelsperre, auch Tupelsperre genannt, ist eine Sperre in der MySQL-Speicher-Engine. In der InnoDB-Engine werden Tupelsperren nur auf „nicht eindeutige“ Sekundärindizes angewendet, um gleichzeitige Vorgänge zu unterstützen. Wenn das Tupel durch eine andere Transaktion gesperrt ist, kann die andere Transaktion nur die Änderung des Datensatzes mit demselben Indexwert abschließen, nicht die Änderung der gesamten Datenzeile.

Grundlegende Syntax der Tupelsperre:

  • SELECT … FROM table_name WHERE key_column=user_input FOR UPDATE;
  • UPDATE … WHERE key_column=user_input;

Unter diesen stellt user_input die Eingabe des Endbenutzers dar, die ein sein kann einzelner Wert oder eine Bedingungsanweisung oder ein Gültigkeitsbereich usw.

Denken Sie daran, bei der Verwendung von Tupelsperren vorsichtig zu sein. Eine unangemessene Verwendung verringert die Leistung der Datenbank-Parallelität erheblich.

  1. Gap Lock

Gap Lock, auch Gap Lock genannt, wird normalerweise verwendet, um nicht wiederholte Lesevorgänge zu verhindern. Tritt häufig in SQL-Operationen auf, die sich über mehrere Zeilen gleichzeitig erstrecken.

Zum Beispiel:

SELECT c1 FROM tbl WHERE c1 BETWEEN 10 and 20 FOR UPDATE;

Zu diesem Zeitpunkt muss die Datenbank alle Zeilen mit c1-Werten zwischen 10 und 20 sperren. Der entsprechende Sperrtyp heißt Lückensperre und sperrt Werte, die in die Lücke fallen, aber nicht vorhanden sind.

So verwenden Sie die Lückensperre:

  • Verwenden Sie die Phantom-Leseansicht (MVCC), um laufende Lesevorgänge zu verfolgen und Lesevorgänge auf Zeilenebene für zukünftige Lesevorgänge bereitzustellen Spaltsperre.
  • Lückenprüfung: Die Lückensperre von S überprüft die Zeilen einzeln, um sicherzustellen, dass diese Zeilen nicht aktualisiert oder gelöscht werden, während das „wiederholbare Lesen“ beibehalten wird.
  • Eines der wichtigsten Probleme bei Lückensperren und deren Zugriff besteht darin, sehr vorsichtig mit der gleichzeitigen Ausführung anderer Dinge umzugehen.

Zusammenfassung

In der tatsächlichen Entwicklung sollten wir den richtigen Sperrtyp auswählen und entsprechend den tatsächlichen Anforderungen geeignete Sperren verwenden, um die Parallelitätsfähigkeit des zu vermeiden System und versuchen Sie, eine Verschlechterung der Systemleistung zu vermeiden. Die verschiedenen von MySQL bereitgestellten Sperrfunktionen können das Problem von Transaktionsvorgängen oder dem gleichzeitigen Zugriff mehrerer Benutzer lösen.

Die richtige Auswahl des geeigneten MySQL-Sperrmechanismus kann die Leistung und Parallelität des Systems effektiv verbessern und unsere Anwendungen robuster und zuverlässiger machen.

Das obige ist der detaillierte Inhalt vonEin Artikel, der die Implementierung von Sperren in MySQL vorstellt. 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