¿Cómo se implementa correctamente el bloqueo optimista en MySQL?
Nuestro equipo ha deducido que debemos hacer el # 4 a continuación o de lo contrario existe el riesgo de que otro hilo pueda actualizar la misma versión del registro, pero nos gustaría validar que esta es la mejor manera de hacerlo.
- Cree un campo de versión en la tabla para la que desea usar el bloqueo optimista, por ejemplo, columna nombre = "versión"
- En selecciones, asegúrese de incluir la columna de versión y tome nota de la versión
- En una actualización posterior del registro, la declaración de actualización debe emitir "where version = X" donde X es la versión que recibimos en el n. ° 2 y establecer el campo de versión durante esa declaración de actualización en X + 1
- Realice un
SELECT FOR UPDATE
registro en el registro que vamos a actualizar para que serialicemos quién puede realizar cambios en el registro que estamos tratando de actualizar.
Para aclarar, estamos tratando de evitar que dos subprocesos que seleccionan el mismo registro en la misma ventana de tiempo donde toman la misma versión del registro se sobrescriban entre sí si intentan actualizar el registro al mismo tiempo. Creemos que a menos que hagamos el n. ° 4, existe la posibilidad de que si ambos hilos ingresan sus transacciones respectivas al mismo tiempo (pero aún no han emitido sus actualizaciones), cuando van a actualizar, el segundo hilo que usará la ACTUALIZACIÓN ... donde version = X funcionará con datos antiguos.
¿Estamos en lo cierto al pensar que debemos hacer este bloqueo pesimista al actualizar a pesar de que estamos usando campos de versión / bloqueo optimista?
SELECT ... FOR UPDATE
o bloqueo optimista por versiones de fila, pero no ambos. Ver detalles en la respuesta.