Heim  >  Artikel  >  Datenbank  >  So implementieren Sie optimistisches Sperren in MySQL

So implementieren Sie optimistisches Sperren in MySQL

WBOY
WBOYOriginal
2022-02-24 10:59:089083Durchsuche

In MySQL können Sie den Versionsaufzeichnungsmechanismus verwenden, um ein Versionsfeld zur Datentabelle hinzuzufügen. Bestimmen Sie, ob der Versionswert mit dem Wert übereinstimmt gerade abgefragt. Wenn gleich, dann führen Sie ein Update durch, wenn nicht gleich, nicht aktualisieren.

So implementieren Sie optimistisches Sperren in MySQL

Die Betriebsumgebung dieses Tutorials: Windows10-System, MySQL8.0.22-Version, Dell G3-Computer.

So implementieren Sie optimistisches Sperren in MySQL

Implementierungsmethode

1. Verwenden Sie den Datenversionsaufzeichnungsmechanismus, um es zu implementieren. Dies ist die am häufigsten verwendete Implementierungsmethode für optimistisches Sperren.

2. Datenversion, d. h. Hinzufügen einer Versionskennung zu den Daten, normalerweise durch Hinzufügen eines numerischen Versionsfelds zur Datenbanktabelle. Beim Lesen von Daten wird der Wert des Versionsfelds zusammen gelesen. Bei jeder Aktualisierung der Daten wird der Versionswert um 1 erhöht. Wenn wir ein Update einreichen, vergleichen wir die aktuellen Versionsinformationen des entsprechenden Datensatzes in der Datenbanktabelle mit dem zum ersten Mal entnommenen Versionswert. Wenn die aktuelle Versionsnummer der Datenbanktabelle mit dem entnommenen Versionswert übereinstimmt Beim ersten Mal werden sie aktualisiert. Andernfalls gelten sie als abgelaufene Daten.

Beispiel

update TABLE
set value=2,version=version+1
where id=#{id} and version=#{version}

Optimistisches Sperren ist nicht in der Datenbank enthalten und muss von uns selbst implementiert werden.

Optimistisches Sperren bedeutet, dass beim Betrieb der Datenbank (Aktualisierungsvorgang) die Idee sehr optimistisch ist, dass dieser Vorgang keine Konflikte verursacht. Beim Betrieb von Daten wird keine andere spezielle Verarbeitung (dh keine Sperrung) durchgeführt. Überprüfen Sie, ob ein Konflikt vorliegt. Die Gesamtidee ist die CAS-Idee.

Die übliche Implementierung ist wie folgt: Wenn Sie die Daten in der Tabelle bearbeiten (aktualisieren), fügen Sie zunächst ein Versionsfeld (Version) zur Datentabelle hinzu und erhöhen Sie die Versionsnummer dieses Datensatzes für jeden Vorgang um 1. Das heißt, fragen Sie zuerst den Datensatz ab und rufen Sie das Versionsfeld ab. Wenn Sie diesen Datensatz bearbeiten (aktualisieren) möchten, stellen Sie zunächst fest, ob der Wert der Version zu diesem Zeitpunkt mit dem Wert der gerade abgefragten Version übereinstimmt Wenn während dieses Zeitraums kein anderes Programm darauf arbeitet, können Sie eine Aktualisierung durchführen und 1 zum Wert des Versionsfelds hinzufügen, wenn während der Aktualisierung festgestellt wird, dass der Versionswert zu diesem Zeitpunkt nicht gleich ist Auf den gerade erhaltenen Versionswert bedeutet dies, dass dieser Zeitraum abgelaufen ist. Wenn andere Programme darauf arbeiten, wird der Aktualisierungsvorgang nicht ausgeführt.

zB:

Der Bestellvorgang umfasst 3 Schritte:

1. Abfrage der Lagerbestände:

Berechnung im Programm: count = count - 2;

3. Lagerbestand aktualisieren :

select (id,count,version) from t_goodsku where id=#{id}

Die in Schritt 1 gefundene Version ist eigentlich ein Snapshot (MVCC-Mechanismus unter Read-Commited- und Read-Repeatable-Isolation-Mechanismus). In diesem Fall müssen Sie beim Aktualisieren in Schritt 3 die Sperre und die Where-Bedingung erwerben #{version} vergleicht in Schritt 1 tatsächlich die aktuelle Version mit der Snapshot-Version. Wenn der Vergleich erfolgreich ist, bedeutet dies, dass diese Daten in diesem Zeitraum nicht von anderen Threads aktualisiert wurden. Die Aktualisierung ist erfolgreich ;

Wenn der Vergleich fehlschlägt, bedeutet dies, dass diese Daten in diesem Zeitraum aktualisiert wurden, die Aktualisierung fehlschlägt und ein Fehler beim Rollback oder Spin gemeldet wird.

Natürlich dient dies dazu, das optimistische Sperrszenario zu simulieren. Tatsächlich kann die Aktualisierung des Inventars in einem Schritt erreicht werden:

1. Inventar aktualisieren:

update t_goodsku
set count={count},version=version+1
where id=#{id} and version=#{version};

Empfohlenes Lernen:

MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo implementieren Sie optimistisches Sperren in MySQL. 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