En el cine al que voy, tienen quioscos de boletos que te permiten seleccionar los asientos que deseas; también tienen un sitio web que hace lo mismo (el sitio web también tiene un temporizador de cuenta regresiva de unos 30 segundos en el que debe elegir un asiento).
Si bien entiendo cosas como las transacciones de la base de datos y otras técnicas para manejar múltiples usuarios simultáneos, no puedo entender cómo se puede permitir que varias personas seleccionen un asiento al mismo tiempo; ¿Es tan simple como que el primero que presione COMPRAR obtenga los asientos y la otra persona recibirá un mensaje de error, o me estoy perdiendo algo?
concurrency
mbwasi
fuente
fuente
Respuestas:
El método clásico para hacer esto es usar una base de datos transaccional (para que no haya conflictos) y hacer una asignación tentativa del asiento que caduque después de un período de tiempo (por ejemplo, 10 minutos para los quioscos) que le dé suficiente tiempo para paga. Si la transacción (visible para el cliente) fracasa o se agota el tiempo de espera, la asignación del asiento puede volver a liberarse en el grupo. (Todos los cambios de estado se procesan a través de la base de datos transaccional, y una transacción visible para el cliente puede requerir muchas transacciones a nivel de base de datos).
Las aerolíneas utilizarán un sistema similar (¡aunque mucho más complejo debido a la necesidad de manejar múltiples tramos de vuelo!) Para reservar asientos en línea. Me imagino que el tiempo de espera sería considerablemente más largo; los billetes de avión son generalmente reservado más adelante que las entradas de cine, y son más caros también.
fuente
Los 30 segundos que ha visto hoy en día suelen ser más de 15 minutos. No creo que haya una transacción de base de datos activa para esa duración.
Si tuviera que diseñar un sistema de este tipo, así es como lo haría: tener los objetos comerciales
Booking
yReservation
. Las reservas son esencialmente confirmadas (es decir, pagadas). Los almacenaría en la misma tabla DB y distinguiría por un atributo o dos.Al buscar asientos disponibles, debe consultar tanto las reservas como las reservas.
Cuando alguien selecciona un asiento, crea una nueva reserva, mostrando así a otros clientes el asiento como ocupado. Se rechazará una segunda reserva para el mismo asiento: la actualización o inserción de la base de datos fallará. Si el cliente confirma / paga la reserva, la pasa a una reserva. En un trabajo por lotes periódico, elimina todas las reservas de más de 15 minutos (o el tiempo que le dé a sus clientes).
fuente
Va con la propiedad ACID de la base de datos - Aislamiento. La base de datos usa bloqueos en los datos para evitar la modificación concurrente de los datos.
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
fuente
Aquí hay al menos 2 procesos de negocio involucrados.
Mostrar asientos disponibles.
Reserve un asiento seleccionado.
Dado que estos procesos no se siguen de manera inmoderada, y dado que 2 personas pueden seleccionar el mismo asiento, surge el problema de concurrencia.
Si el diseño de su base de datos asigna la restricción de unicidad correcta para que la combinación de:
-ID del teatro
-SeatID
-EventID
son únicos, entonces la base de datos evitará duplicados.
El siguiente escenario también es posible pero será atendido por la implementación sugerida anteriormente:
Suponiendo que se puede mostrar una vista de cuadrícula de disponible para un teatro y un evento determinados:
Entonces, todo lo que necesita hacer puede ser nada más que un diseño correcto de la base de datos y una elección adecuada de las restricciones.
Otros enfoques más complejos son posibles si lo desea, utilizando colas de transacciones. En este caso, las solicitudes se escriben primero en una cola y luego se activa un proceso cada n segundos, pero eso no es necesario ni práctico en su caso.
La parte realmente interesante es ¿qué debería mostrar la cuadrícula de la lista para el usuario 1?
fuente
Puede evitar la condición de la carrera si retrasa la asignación de asientos específicos.
fuente