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