sql >> Base de Datos >  >> RDS >> Mysql

MySQL InnoDB:diferencia entre 'PARA ACTUALIZAR' y 'BLOQUEAR EN MODO COMPARTIDO'

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.