1. Warum brauchen wir Sperren (Parallelitätskontrolle)?
In einer Mehrbenutzerumgebung können mehrere Benutzer gleichzeitig denselben Datensatz aktualisieren, was zu Konflikten führen kann. Dies ist das berühmte Parallelitätsproblem.
Typische Konflikte sind:
1. Verlorene Updates: Die Updates einer Transaktion überschreiben die Update-Ergebnisse anderer Transaktionen, es handelt sich um das sogenannte verlorene Update. Beispiel: Benutzer A ändert den Wert von 6 auf 2 und Benutzer B ändert den Wert von 2 auf 6, dann verliert Benutzer A sein Update.
2. Dirty Read: Dirty Read tritt auf, wenn eine Transaktion Datensätze anderer halb abgeschlossener Transaktionen liest. Beispiel: Die von Benutzern A und B angezeigten Werte sind beide 6, Benutzer B ändert den Wert auf 2 und der von Benutzer A gelesene Wert ist immer noch 6.
Um diese durch Parallelität verursachten Probleme zu lösen. Wir müssen einen Mechanismus zur Parallelitätskontrolle einführen.
2. Parallelitätskontrollmechanismus
Sperren Sie die von uns ausgewählten Zieldaten, damit sie nicht von anderen Programmen geändert werden können.
1. Pessimistische Sperre: bezieht sich auf eine konservative Haltung gegenüber Daten, die von der Außenwelt geändert werden (einschließlich anderer aktueller Transaktionen des Systems und der Transaktionsverarbeitung von externen Systemen). Daten befinden sich in einem gesperrten Zustand
2. Optimistische Sperre: Gehen Sie davon aus, dass keine Parallelitätskonflikte auftreten, und prüfen Sie beim Senden des Vorgangs nur, ob die Datenintegrität verletzt ist. Optimistisches Sperren kann das Problem schmutziger Lesevorgänge nicht lösen.
3. Implementierung des optimistischen Sperrens
Verwenden Sie zur Implementierung den Datenversionsaufzeichnungsmechanismus, der die am häufigsten verwendete Implementierungsmethode des optimistischen Sperrens ist. Was ist eine Datenversion? Dabei wird den Daten eine Versionskennung hinzugefügt, normalerweise durch Hinzufügen eines numerischen „Version“-Felds zur Datenbanktabelle. Beim Lesen von Daten wird der Wert des Versionsfelds zusammengelesen. Bei jeder Aktualisierung der Daten wird der Versionswert um eins 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
1. Datenbanktabellendesign
Aufgabe
hat drei Felder, nämlich ID, Wert, version
2. Implementierung
1) Lesen Sie zuerst die Daten in der Aufgabentabelle (eigentlich gibt es nur einen Datensatz in dieser Tabelle) und erhalten Sie den Wert der Version als versionValue
2) Jedes Mal, wenn das Wertefeld in der Aufgabentabelle aktualisiert wird, um zu verhindern, dass ein Konflikt auftritt, müssen Sie Folgendes tun:
Aufgabensatzwert aktualisieren = neuer Wert, Version = Versionswert + 1, wobei Version = versionValue;
Nur wenn diese Anweisung ausgeführt wird, zeigt sie an, dass das Wertfeld dieses Mal aktualisiert wurde
Angenommen, es gibt zwei Knoten A und B, die aktualisiert werden möchten Der Wert des Wertfelds in der Aufgabentabelle ist fast gleichzeitig der von Knoten A und Knoten B aus der Aufgabentabelle gelesene Versionswert. Wenn dann Knoten A und Knoten B den Wert des Wertfelds aktualisieren, führen beide die Aktualisierungsaufgabe aus set value = newValue, version = 3, wobei version = 2;. Tatsächlich führt nur ein Knoten die SQL-Anweisung erfolgreich aus. Dann ist der Wert des Versionsfelds der Aufgabentabelle zu diesem Zeitpunkt 3. Knoten B führt dann den Befehl update task set value = newValue, version = 3 aus, wobei diese SQL-Anweisung nicht ausgeführt wird, wodurch sichergestellt wird, dass die Task-Tabelle nicht aktualisiert wird.
Verwandte Empfehlungen:
Wie man den Transaktionsmechanismus implementiert und optimistisch Sperren in Redis
Optimistische Sperre und pessimistische Sperre für Datenbanktransaktionen
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des optimistischen Sperrprinzips von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!