Su problema se reduce a la pregunta de "cuál debería ser el bloqueo de sincronización" . Según su pregunta, parece que la reserva no es una reserva de un artículo específico. Pero supongamos que un usuario está reservando una habitación de hotel específica, por lo que debe resolver dos problemas:
- evitar el exceso de reservas (por ejemplo, reservar lo mismo para dos personas)
- prevenir errores de cálculo del estado de cuentas paralelas
Entonces, cuando un usuario llega a un punto en el que está a punto de presionar confirmar botón, este es un posible escenario que puede implementar:
-
comenzar transacción
-
bloquear la entrada del usuario para que se bloqueen los procesos paralelos
SELECT * FROM user FOR UPDATE WHERE id = :id
-
vuelva a comprobar el saldo de la cuenta y lance una excepción/reversión si no hay fondos suficientes
-
bloquear el artículo que se va a reservar para evitar la sobreventa
SELECT * FROM room FOR UPDATE WHERE id = :id
-
vuelva a comprobar la disponibilidad de la reserva y lance una excepción/reversión si el artículo ya está reservado
-
crear entrada de reserva y restar fondos de la cuenta del usuario
-
confirmar transacción (se liberarán todos los bloqueos)
Si, en su caso, no necesita verificar el exceso de reservas, simplemente omita / ignore los pasos 4 y 5.