2015-09-28 19 views
6

Was zwischen den beiden Sperrklauseln lesen die genaue Unterschied ist:MySQL InnoDB: Unterschied zwischen `FÜR UPDATE` und LOCK IN SHARE MODE`

SELECT ... FOR UPDATE 

und

SELECT ... LOCK IN SHARE MODE 

Und warum würden Sie müssen sie übereinander liegen?

+0

möglich Duplikat [ „FOR UPDATE“ v/s „LOCK IN SHARE MODE“: Erlaubt gleichzeitige Threads aktualisiert „Zustand“ Wert der gesperrten Zeile lesen] (http: // stackoverflow.com/questions/9037345/for-update-vs-lock-in-share-mode-allow-concurrent-threads-to-read-updated) –

Antwort

13

Ich habe versucht, den Unterschied zwischen den beiden zu verstehen. Ich werde dokumentieren, was ich in der Hoffnung gefunden habe, dass es für die nächste Person nützlich sein wird.

Sowohl LOCK IN SHARE MODE als auch FOR UPDATE stellen Sie sicher, dass keine andere Transaktion die ausgewählten Zeilen aktualisieren kann. Der Unterschied zwischen den beiden besteht darin, wie sie Sperren beim Lesen von Daten behandeln.

LOCK IN SHARE MODE nicht daran hindert, eine andere Transaktion aus der gleichen Zeile zu lesen, die gesperrt wurde.

FOR UPDATE verhindert andere Lesevorgänge in der gleichen Zeile (Lesevorgänge mit nicht schreibenden Leseoperationen können diese Zeile immer noch lesen; LOCK IN SHARE MODE und FOR UPDATE sind schreibende Lesevorgänge).

Dies ist wichtig, in solchen Fällen der Aktualisierung Zähler, in dem Sie Wert in 1 Anweisung lesen und den Wert in einem anderen aktualisieren. Hier können Sie mit LOCK IN SHARE MODE 2 Transaktionen den gleichen Anfangswert lesen. Wenn also der Zähler von beiden Transaktionen um 1 erhöht wurde, könnte die Endzählung nur um 1 erhöht werden, da beide Transaktionen anfänglich denselben Wert lesen.

FOR UPDATE Verwendung würde die zweite Transaktion gesperrt haben den Wert von Lesen bis der erste getan. Dadurch wird sichergestellt, wird der Zähler um 2 erhöht

+0

Nach https://dev.mysql.com/doc/refman /5.7/en/innodb-locking-reads.html "mindestens einer von ihnen endet in Deadlock" - nicht Zähler um 1 anstelle von 2 erhöhen, wie Sie angegeben. Irgendwelche Ideen, warum Deadlock auftreten kann? –