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

[email protected] (Sergio Carlos Morales) Thu, 22 Mar 2012 12:26:53 -0600
Newsgroups php.general.es
Message-ID <CAFjkEJdvCmTXChpqJBOaAhtr_+3A-0eUvDcQ8BeziPsHmreDVQ@mail.gmail.com>
Definitivamente la solucion con semanforos puede ser correcta para la
concurrencia, pero no creo que haya tanta necesidad de irte a bajo nivel.

Dependiendo del DBMS que estas usando, haz uso de transacciones, las
transacciones aseguran que las operaciones son atomicas y evitarias ese
problema a nivel de base de datos , abstrayendo tu codigo PHP del problema.



On Mon, Mar 19, 2012 at 2:52 PM, Ricardo Vila <[email protected]>wrote:

> 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
> >
> >
>