Der MySQL-Sperrmechanismus ist in Sperren auf Tabellenebene und Sperren auf Zeilenebene unterteilt. In diesem Artikel werde ich Ihnen die Freigabe und den Austausch gemeinsamer Sperren und exklusiver Sperren in Sperren auf Zeilenebene in MySQL vorstellen.
Eine gemeinsame Sperre wird auch als Lesesperre oder kurz S-Sperre bezeichnet. Wie der Name schon sagt, bedeutet eine gemeinsame Sperre, dass mehrere Transaktionen eine Sperre für dieselben Daten teilen können und alle auf die Daten zugreifen können kann es nur lesen und nicht ändern.
Exklusive Sperre wird auch Schreibsperre oder kurz X-Sperre genannt. Wie der Name schon sagt, kann eine exklusive Sperre nicht mit anderen Sperren koexistieren. Wenn eine Transaktion eine exklusive Sperre für eine Datenzeile erhält, ist dies nicht mehr möglich Erfassen Sie die Zeile. Andere Sperren umfassen gemeinsame Sperren und exklusive Sperren, aber die Transaktion, die die exklusive Sperre erwirbt, kann die Daten lesen und ändern.
Jeder hat möglicherweise ein gutes Verständnis für gemeinsame Sperren, das heißt, mehrere Transaktionen können Daten nur lesen, aber nicht ändern. Allerdings hat jeder ein anderes Verständnis für exklusive Sperren. denken, dass exklusive Sperren Nachdem eine Datenzeile gespeichert wurde, können andere Transaktionen die Datenzeile nicht lesen und ändern. Dies ist nicht der Fall. Eine exklusive Sperre bedeutet, dass andere Transaktionen keine weiteren Sperren hinzufügen können, nachdem eine Transaktion einer Datenzeile eine exklusive Sperre hinzugefügt hat. Die standardmäßige Änderungsdatenanweisung der MySQL-InnoDB-Engine fügt den beteiligten Daten automatisch exklusive Sperren hinzu. Wenn Sie eine exklusive Sperre hinzufügen, können Sie standardmäßig keine Sperre hinzufügen Um eine gemeinsame Sperre hinzuzufügen, können Sie die Anweisung „select...for update“ im Share-Modus verwenden. Daher können die Datenzeilen mit exklusiver Sperre in anderen Transaktionen nicht geändert werden, und die Daten können nicht zum Aktualisieren und Sperren im Freigabemodus abgefragt werden. Die Daten können jedoch direkt über select...from... abgefragt werden, weil Gewöhnlich Abfragen verfügen über keinen Sperrmechanismus.
Schauen wir uns vor diesem Hintergrund das folgende einfache Beispiel an:
Wir haben die folgenden Testdaten
Jetzt führen wir eine exklusive Abfrage der Datenzeile mit der ID=1 durch. Hier verwenden wir begin, um die Transaktion zu öffnen, und Sie werden nicht sehen, dass ich die Transaktion schließe. Dies dient zum Testen, da die Transaktion festgeschrieben oder zurückgesetzt wird Durch die Transaktion wird die Sperre aufgehoben.
Ein Abfragefenster öffnen
fragt nun ein weiteres Abfragefenster ab und verwendet die exklusive Abfrage und die gemeinsame Sperrabfrage für dieselben Daten. Möglichkeiten zur Abfrage
Exklusive Abfrage
Gemeinsame Abfrage
Wir sehen, dass die exklusive Sperre ist aktiviert Sowohl die Abfrage als auch die Abfrage mit gemeinsamer Sperre befinden sich in einem Blockierungsstatus, da die Daten mit der ID = 1 mit einer exklusiven Sperre gesperrt wurden und die Blockierung hier auf die Freigabe der exklusiven Sperre wartet.
Was passiert, wenn wir die folgende Abfrage direkt verwenden?
Wir sehen, dass die Daten abgefragt werden können.
Sehen wir uns noch einmal eine Transaktion an, die eine gemeinsame Sperre erhält. Bei anderen Abfragen können wir nur gemeinsame Sperren hinzufügen oder nicht.
Wir sehen, dass wir die Daten abfragen können, aber wir können sie nicht finden, wenn wir sie hinzufügen eine exklusive Sperre, da exklusive Sperren und gemeinsame Sperren nicht für dieselben Daten vorhanden sein können.
Abschließend überprüfen wir das oben erwähnte Problem des automatischen Hinzufügens exklusiver Sperren zu den Aktualisierungs-, Lösch- und Einfügeanweisungen in der MySQL-InnoDb-Engine Diesmal befindet sich die gemeinsame Abfrage im Blockierungsmodus und wartet auf die Freigabe der exklusiven Sperre. Die Daten können jedoch mithilfe normaler Abfragen gefunden werden, da sich der Sperrmechanismus nicht gegenseitig mit der exklusiven Sperre ausschließt, sondern die gefundenen Daten die alten Daten sind bevor die Daten geändert werden.
Dann übermitteln wir die Daten, geben die exklusive Sperre frei und sehen uns die geänderten Daten an. Zu diesem Zeitpunkt können exklusive Abfragen, gemeinsame Abfragen und normale Abfragen verwendet werden Nach der Übermittlung der Transaktion werden die Zeilendaten freigegeben. Nachfolgend werden nur normale Abfragen angezeigt, die von anderen Schülern selbst überprüft werden können.
Sie können sehen, dass das Ergebnis wie erwartet ist.
Empfohlenes Tutorial: „MySQL-Tutorial“
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der gemeinsamen Sperren und exklusiven Sperren in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!