He estado tratando de entender la diferencia entre los dos. Documentaré lo que encontré con la esperanza de que sea útil para la próxima persona.
Ambos LOCK IN SHARE MODE
y FOR UPDATE
asegúrese de que ninguna otra transacción pueda actualizar las filas seleccionadas. La diferencia entre los dos está en cómo tratan los bloqueos mientras leen los datos.
LOCK IN SHARE MODE
no evita que otra transacción lea la misma fila que estaba bloqueada.
FOR UPDATE
evita otras lecturas de bloqueo de la misma fila (las lecturas sin bloqueo aún pueden leer esa fila; LOCK IN SHARE MODE
y FOR UPDATE
son lecturas de bloqueo).
Esto es importante en casos como la actualización de contadores, donde lee el valor en 1 declaración y actualiza el valor en otra. Aquí usando LOCK IN SHARE MODE
permitirá que 2 transacciones lean el mismo valor inicial. Entonces, si el contador se incrementó en 1 por ambas transacciones, el conteo final podría aumentar solo en 1, ya que ambas transacciones inicialmente leyeron el mismo valor.
Usando FOR UPDATE
habría bloqueado la segunda transacción para que no lea el valor hasta que se complete la primera. Esto asegurará que el contador se incremente en 2.