Re: [PHP-ES] Consulta sobre php y mysql

[email protected] (Ricardo Vila) Mon, 19 Mar 2012 15:52:12 -0500
Newsgroups php.general.es
Message-ID <CAM9wsNVZVSqfQ4j0EgK9Nm5bzefw9_huf5NdzDpD5XLwSK9TGQ@mail.gmail.com>
BUenas Listeros

Ante todo agradezco por la ayuda brindada, estuve viendo el tema de como
resolver la concurrencia, y decidi manejar semáforos pero ahora tengo una
pregunta.

Tengo el siguiente codigo implementado

....

                if($gano==1){
                    //creo el semaforo y libero luego de actualizar
                    $key = 123456;
                    $max = 1;
                    $permissions = 0666;
                    $autoRelease = 1;
                    $semaphore =
sem_get($key,$max,$permissions,$autoRelease);
                    //if(!$semaphore) {
                     //    echo "Failed on sem_get().\n";
                      //   exit;
                   // }
                    //consulto si hay premio y actualizo
                     $prem = new premio();
                     sem_acquire($semaphore);
                         $gana = $prem->actualizar_premio($premio);

                     sem_release($semaphore);
                }



....
En ese codigo creo el semaforo, luego lo obtengo y llamo al metodo
actualizar_premio, este metodo lo que hace es consultar si el premio q gano
aun quedan disponibles si es asi, hago un update del premio y resto en 1 la
cantidad de premios disponibles, finalmente libero el semaforo

Ahora mi consulta es: con el código que está actualmente, que pasaría si
dos usuarios intentan ingresar simultaneamente, de acuerdo al tema de
semaforos, un usuario toma el semaforo y el otro debería quedar esperando,
pero en mi código como reflejaria eso, tendría que hacer un while como para
que siga esperando a que el semaforo se libere para poder ingresar?,
podrían darme una idea de como podría hacer para que mientras el semaforo
este ocupado los demas usarios sigan esperando?

Agradezco de antemano su respuesta

Saludos,
Ricardo



2012/3/15 Fermin <[email protected]>

> Buenas, esto puede resolverse mediante semaforos,
> http://php.net/manual/es/function.sem-get.php
>
> La seccion critica (que que otorga el premio, es la que solo sera
> accesible por un solo usuario, de esta forma el premio te aseguras que
> solo lo de una vez.
>
> Hay ejemplos en la doc, y puede ser una solucion sencilla.
>
> On Wed, Mar 14, 2012 at 5:51 PM, Satyam <[email protected]> wrote:
> > Antes de otorgar el premio debes hacer, mediante AJAX o técnica similar,
> una
> > conexión con el servidor que haga dos operaciones en la base de datos que
> > verifique que el premio no ha sido otorgado.   Esto, habitualmente, se
> > traduce en hacer un update de un campo booleano en el premio que indique
> que
> > ha sido otorgado, solo si ese campo es falso.
> >
> > Update TablaPremios set otorgado= 1 where premio='xxxxx' and otorgado =
> 0;
> >
> > Luego verificas el numero de registros afectados.  Si se ha afectado un
> > registro, es que no había sido otorgado.  Si no se afecto ningun
> registro,
> > es que ya estaba otorgado. Nota que en esta unica instrucción, que no
> admite
> > interrupciones, verificas que no haya sido otorgado y lo marcas otorgado,
> > todo en una operación indivisible.
> >
> > Satyam
> >
> >
> > On 03/14/2012 05:01 PM, Ricardo Vila wrote:
> >>
> >> Bueno estoy usando innodb, el tema es que quiero ver como prevenir que
> un
> >> premio se entregue a dos personas.
> >>
> >> porque el proceso como lo mencione es:
> >> - veo si hay premios (una consulta a la bd)
> >> - genero un arreglo de 10 posiciones (el # de posiciones puede cambiar,
> >> solo a modo de ejemplo puse 10)
> >> - Si hay premios (en este caso se asume que solo queda 1 premio), lo
> >> agrego
> >> al arreglo
> >> teniendo : $arrpremio = array(0,0,0,1,0,0,0,0,0,0)
> >> - Luego obtengo un random de 0 a 9,(asumo que me manda 3)
> >> - Ese valor es el indice del arreglo, entonces obtengo su valor, es
> decir
> >> $gano = $arrpremio[3] ( y esto es igual a 1)
> >> - aca pregunto si valor es 1, gano si no que siga intentando
> >> - Entonces bajo este esquema, se puede dar que a dos usuarios jugando
> >> simultaneamente les muestre el premio.
> >>
> >> Agradezco de antemano sus respuestas
> >>
> >> Saludos,
> >> Ricardo Vila
> >>
> >>
> >>
> >> 2012/3/14 Ricardo Martinez<[email protected]>
> >>
> >>> Mmm, en mi opinión:
> >>>
> >>> entiendo que como motor estás usando MyIsam. En caso contrario
> >>> especificalo.
> >>>
> >>> Todas las consultas que dices que haces y acciones, deberías de
> hacerlas
> >>> todas la vez dentro de un
> >>>
> >>> try
> >>>    {
> >>>     sentencias
> >>>   }
> >>>
> >>> Un saludo!!!
> >>>
> >>>
> >>> On Wed, Mar 14, 2012 at 12:14 AM, Ricardo
> >>> Vila<[email protected]>wrote:
> >>>
> >>>> Buenas listeros,
> >>>>
> >>>> La presente es para consultarles respecto a como podría hacer para
> >>>> evitar
> >>>> que un registro se muestre igual a dos usuarios distintos, me explico
> >>>> con
> >>>> un ejemplo
> >>>>
> >>>> Tengo una tabla premios, con los campos idpremio, cantidad
> >>>>
> >>>> entonces como puedo prevenir que si tengo un registro que tenga en el
> >>>> campo
> >>>> cantidad = 1, y dos usuarios ingresan a la vez, el sistema lo que hace
> >>>> es
> >>>> ver si hay premios, en este caso, obtiene 1, luego genero un arreglo
> de
> >>>> 10
> >>>> posiciones y coloco este id dentro, genero un random y luego obtengo
> un
> >>>> indice y con esto veo si gano o no, entonces, si dos usuarios estan a
> la
> >>>> vez ingresando, hay la posibilidad de que a ambos le salga que ganaron
> >>>> el
> >>>> premio cuando en realidad solo hay un premio.
> >>>>
> >>>> Como podría evitar este problema, estuve pensando en bloquear las
> tabla
> >>>> hasta que termine de jugar un usuario, pero eso tomaría tiempo por
> cada
> >>>> usuario, de ser así, sería factible usar colas, para poder procesar
> esta
> >>>> información
> >>>>
> >>>> agradezco de antemano su respuesta
> >>>>
> >>>> Saludos,
> >>>> Ricardo Vila
> >>>>
> >>>
> >>>
> >>> --
> >>> Ricardo
> >>> _______________________________________________
> >>> IT Architect
> >>> website: http://www.pulsarinara.com
> >>>
> >
> > --
> > PHP Spanish Localization Talk Mailing List (http://www.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php
> >
>
> --
> PHP Spanish Localization Talk Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>