bombero_7 Posted September 19, 2012 Report Share Posted September 19, 2012 estoy haciendo un programita de buses en donde son varios puestos de venta de pasajes y me asalta la siguiente duda como puedo hacer para que no se compren dos pasajes identicos al mismo tiempo ? me explico al momento de comprar pasaje se reserva el asiento, como evito que se realicen dos ventas del mismo asiento en el mismo bus en el mismo momento????? cualquier idea seria de mucha ayuda gracias..... Link to comment Share on other sites More sharing options...
Ra Posted September 21, 2012 Report Share Posted September 21, 2012 Se me ocurren 3 opciones:- Puedes reservar manteniendo el dato en una tabla adicional; por lo tanto, la consulta de disponibilidad de asientos tiene que hacer un JOIN (o NOT IN) con esta tabla... Cuando se concreta la venta (o se cancela), se elimina el registro de esta tabla y se inserta en la tabla de ventas...- En la misma tabla, pero con un indicador de estado tipo "en venta"... cuando se concreta la venta puedes cambiar el estado a "vendido"...- No hacer la reserva, sino que consultar junto antes de insertar la venta... Si justo se vendió un milisegundo antes, le devuelves el mensaje al usuario que se vendió... Aun así, veo un par de problemas con las reservas: - Que pasa si se pierde la conexión con el servidor... Cualquiera de las 2 opciones dejará amarrados esos asientos y no se podrán vender... A no ser que todos los usuarios tengan la facultad de poder eliminar esos registros y "tomar posesión" de esos asientos...- Considerando que entre la selección del asiento y el cierre efectivo de la venta hay un tiempo razonable (un par de minutos), reservar los asientos se puede convertir en una menor venta... Por ejemplo, un cliente selecciona el asiento 5 a las 10:00... esta venta se cancelará a las 10:05... Este es el único asiento disponible en el bus... En otro punto, otro cliente consulta por disponibilidad a las 10:01... El usuario verá que el bus está lleno, pero el asiento 5 está reservado... le va a decir al cliente que esperen un par de minutos a ver si se concreta la venta del otro punto... esperan hasta las 10:03 y sigue reservado... el usuario tiene 3 opciones... 1. llama por teléfono al otro vendedor para preguntar qué onda... 2. le dice al cliente que espere 2 minutos más... 3. le dice al cliente que no quedan asientos... Sono+ Link to comment Share on other sites More sharing options...
known Posted September 23, 2012 Report Share Posted September 23, 2012 Deberías consultar si el asiento sigue reservado en cada fase de la compra:Cuando el usuario ponga "pagar", compruebas antes de descontarle el saldo de su tarjeta si aun sigue libre el asiento. Link to comment Share on other sites More sharing options...
bombero_7 Posted September 25, 2012 Author Report Share Posted September 25, 2012 bueno finalmente lo que se me ocurrio fue simplemente al momento de comprar validad si el asiento en esa fecha y hora estaba vendido, de no estarlo continua la venta grabacion de datos e impresion de boleto, y si estaba ocupado arrojaba error indicando que estaba ocupado y dando la opcion de reelegir otro asiento Link to comment Share on other sites More sharing options...
xomarx69 Posted September 25, 2012 Report Share Posted September 25, 2012 (edited) Hola amigo, sólo como comentario, debes tener cuidado con la concurrencia de los datos ya que después que tu lees el estado de un campo, otra sessión puede modificar ese valor y cuando intentes actualizar el valor este ya no es el mismo, si entiendo lo que estás haciendo, podrías vender dos veces el mismo boleto, mira: sesión 1: lee estado del asiento X que está en "D" de disponible,sessión 2: lee estado del asiento X que está en "D" de disponible,sesión 1: actualiza el asiento X con "R" de reservado,sesión 2: actualiza el asiento X con "R" de reservado(que ya estaba reservado!!)sesión 1: imprime boletosesión 2: imprime boleto(que ya ha sido impreso!!!!) Una posible solución es bloquear el registro al momento de leer el dato y desbloquearlo luego de actualizarlo, pero no te recomiento esta opción ya que puede haber cortes de comunicación que pueden dejar colgadas las tablas. La otra opción un poco más simple pero no muy bonita es crear una tabla temporal con la PK bus, hora salida y asiento, de modo que si se puede insertar el asiento a reservar, es porque este está disponible, si dos sesiones tratan de reservar un asiento al "mismo tiempo" sólo el primero en llegar va a poder hacerlo ya que la PK te valida el dato.Tal vez no sea una solución limpia, pero me parece que funciona, las actualizaciones de datos para reservas no funcionan a menos que bloquees el registro(al menos en las bases de datos que manejo). Saludos y suerte! Edited September 25, 2012 by xomarx69 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now