MySQL: Race-Bedingung verhindern - FOR UPDATE oder LOCK IN SHARE MODE?
-
21-08-2019 - |
Frage
Hier ist meine gewünschte Transaktion Bestellung:
- User1 Auswahlfeld, führt den Betrieb, Update mit neuem Wert.
- User2 Auswahlfeld, führt den Betrieb, Update mit neuem Wert.
- User3 Auswahlfeld, führt den Betrieb, Update mit neuem Wert.
Von dem, was ich verstehen die wählen Sie zunächst nur eine Schreibsperre durchführen, während die zweite lesen perform und Schloss schreiben.
Beide scheint brauchbar, aber im ersten Fall, welcher Wert wird User2 lesen? Der Anfangswert vor User1-Updates oder den Wert nach Benutzer1 Updates (das ist, was ich will)?
Also ich verwirrt bin, soll ich SELECT ... FOR UPDATE oder SELECT ... LOCK IN SHARE MODE?
Lösung
Sie wollen wahrscheinlich FOR UPDATE verwenden.
Mit „LOCK IN SHARE MODE“ der zweite Benutzer noch in der Lage sein, den Wert zu lesen, bevor sie aktualisiert wurde.
Von der MySQL-Dokumentation:
Wenn Sie FOR UPDATE mit einem Speicher verwenden Motor, der Seite oder Zeilensperren verwendet, Zeilen, die von der Abfrage geprüft sind bis zum Ende der Schreib-locked aktuelle Transaktion. Mit LOCK IN SHARE MODE setzt eine gemeinsame Sperre, die andere Transaktionen ermöglicht es dem lesen sucht Reihen aber nicht zu aktualisieren oder löschen.
Also auch wenn LOCK IN SHARE MODE ein Update verhindert, wenn Sie den Betrieb auf dem gelesenen Wert abhängt, kann man in einem inkonsistenten Zustand enden.