Wie implementiert man optimistisches Sperren in MySQL richtig?
Unser Team hat festgestellt, dass wir # 4 unten ausführen müssen, da sonst das Risiko besteht, dass ein anderer Thread dieselbe Version des Datensatzes aktualisieren kann. Wir möchten jedoch bestätigen, dass dies der beste Weg ist, dies zu tun.
- Erstellen Sie ein Versionsfeld in der Tabelle, für die Sie eine optimistische Sperre verwenden möchten, z. B. Spaltenname = "Version".
- Stellen Sie bei der Auswahl sicher, dass Sie die Versionsspalte einschließen und die Version notieren
- Bei einer nachfolgenden Aktualisierung des Datensatzes sollte die Aktualisierungsanweisung "where version = X" ausgeben, wobei X die Version ist, die wir in # 2 erhalten haben, und das Versionsfeld während dieser Aktualisierungsanweisung auf X + 1 setzen
- Führen Sie eine
SELECT FOR UPDATE
Aktualisierung des Datensatzes durch, den wir aktualisieren möchten, damit wir serialisieren, wer Änderungen an dem Datensatz vornehmen kann, den wir aktualisieren möchten.
Zur Verdeutlichung versuchen wir zu verhindern, dass zwei Threads, die denselben Datensatz im selben Zeitfenster auswählen, in dem sie dieselbe Version des Datensatzes abrufen, sich gegenseitig überschreiben, wenn sie versuchen, den Datensatz gleichzeitig zu aktualisieren. Wir glauben, dass, wenn wir nicht # 4 tun, die Möglichkeit besteht, dass, wenn beide Threads ihre jeweiligen Transaktionen gleichzeitig eingeben (aber ihre Updates noch nicht veröffentlicht haben), wenn sie zur Aktualisierung gehen, der zweite Thread, der das UPDATE verwendet ... wobei version = X mit alten Daten arbeitet.
Denken wir zu Recht, dass wir diese pessimistische Sperrung beim Aktualisieren durchführen müssen, obwohl wir Versionsfelder / optimistische Sperrung verwenden?
SELECT ... FOR UPDATE
oder eine optimistische Sperre durch Zeilenversionierung, nicht beide. Siehe Detail in der Antwort.