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.