Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/07/2008, 12:11
Vera828
 
Fecha de Ingreso: junio-2008
Mensajes: 16
Antigüedad: 16 años, 7 meses
Puntos: 0
Problema de Concunrencia

Hola a todos, a ver si es posible que alguien me pueda ayudar, me he vuelto loca buscando todo el dia sobre el mismo asunto y nada para funcionar..

La cuestión es la siguiente:

Tengo una aplicacion web que entre otras cosas realiza la inscripcion de usuarios en talleres. Los talleres tienen unas plazas limitadas, y necesito controlar que no se sobrepasen esas plazas. Cada vez que se intenta inscribir un usuario, compruebo si el numero de plazas es mayor numero de solicitudes de inscripcion y si hay plazas permito la inscripcion. El problema viene cuando solamente queda una plaza libre. En el mejor de los casos, el primer usuario que llegue la ocupará..
pero si dos usuarios justo en el mismo instante ven que queda una sola plaza, se inscribiran los dos.. Entonces habrá mas inscripciones que plazas y esto es un error.

El mismo problema tengo con la ocupacion de una aula en una determinada fecha.

Intentando buscar soluciones pensé en semaforos, pero como corro php bajo xamp en windows no es posible usar semaforos (lei que solo era posible en unix).
¿Esto en lo correcto?

Encontré también un metodo para bloquear un archivo y despues desbloquearlo
Código PHP:
$bloqueo './bloqueo';  // Nombre del archivo de bloqueo

if (is_file ($bloqueo)) {
    print 
"Lo siento, alguien ha bloqueado el sistema.\n" .
     
"Intente mas tarde.\n</pre>\n";
    exit (
1);
}
        
touch ($bloqueo);  // Crear el archivo, creando en efecto un bloqueo
        
// Aqui se hacen todos los procesos criticos... Cosas interesantes que
// contribuyan con la dominacion del mundo, si se quiere.
        
$Resultado=$Taller->InscribirEnTaller();
        
//sleep (5);  // Por ahora, solo retengamos es bloqueo por 5 segundos
        
unlink ($bloqueo);  // Retirar el bloqueo 
Pero este metodo no bloquea a los demas usuarios, a la espera de continuar, siemplemente les informa y sale, si hiciera un while(isset....) sleep(5) quizá pecara de espera ocupada..
Y otro problema que se suma, es que si los demas usuarios quieren inscribirse en un taller del que tambien queda una plaza, aunque sean distintos talleres tambien les afecta. ¿Como bloquear solamente en ese taller y no en todos?

-Otra opcion que encontre era utilizar el patron Singleton.. pero probé y tampoco, se creaban instancias de Singleton desde cualquier clase :S

Alguien me puede ayudar?
Gracias por adelantado.

Última edición por Vera828; 17/07/2008 a las 12:34