Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL InnoDB:Unterschied zwischen „FOR UPDATE“ und „LOCK IN SHARE MODE“.

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

Beide LOCK IN SHARE MODE und 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 verhindert nicht, dass eine andere Transaktion dieselbe Zeile liest, die gesperrt war.

FOR UPDATE verhindert andere sperrende Lesevorgänge derselben Zeile (nicht sperrende Lesevorgänge können diese Zeile weiterhin lesen; LOCK IN SHARE MODE und FOR UPDATE sind Lesezugriffe).

Dies ist in Fällen wie dem Aktualisieren von Zählern von Bedeutung, bei denen Sie den Wert in einer Anweisung lesen und den Wert in einer anderen aktualisieren. Hier mit LOCK IN SHARE MODE ermöglicht 2 Transaktionen, denselben Anfangswert zu lesen. Wenn also der Zähler von beiden Transaktionen um 1 erhöht wurde, erhöht sich der Endzähler möglicherweise nur um 1 - da beide Transaktionen anfänglich denselben Wert lesen.

Mit FOR UPDATE hätte die zweite Transaktion daran gehindert, den Wert zu lesen, bis die erste abgeschlossen ist. Dadurch wird sichergestellt, dass der Zähler um 2 erhöht wird.