Hola, como soluciona PHP el problema de la concurrencia?? o no es posible.
Porque toda base de datos distribuida, tiene ese problema.
Si alguién tiene algún comentario, se lo agradecería.
Un saludo.
| |||
Puede solucionar PHP el problema de la concurrencia?? Hola, como soluciona PHP el problema de la concurrencia?? o no es posible. Porque toda base de datos distribuida, tiene ese problema. Si alguién tiene algún comentario, se lo agradecería. Un saludo. |
| |||
Hola, Concurrencia es cuando dos o mas procesos (usuarios, programas, etc) intentan acceder a la vez al mismo recurso (memoria, fichero, registro, etc). Saludos.
__________________ Josemi Aprendiz de mucho, maestro de poco. |
| |||
Hola, bueno nuevo te voy a poner un ejemplo para que entiendas el problema y así puedes saber de que mas o menos va el tema. Suponte que tú accede a un formulario de modificación, por ejemplo, y que te pones a modificar datos del Cliente 001. En ese momento que tu estas modificando datos, otra persona accede a esa aplicación al formulario de borrado y borra el Cliente 001. Cuando tu le des al botón de actualizar en tu formulario de modificación... ERROR: Ese cliente ya no está en la tabla Por eso debe haber "algo" que le diga a la segunda persona que ese Cliente 001 se está modicando y que no tiene acceso a él por el momento, que pruebe mas tarde. Espero haberte aclarado algo. Si tienes dudas sobre algo no tienes mas que preguntar. Un saludo. |
| ||||
claro,,, pues eso que tu dices es mas sencillo que todo esto...jejeje, pq no añades un campo mas en la tabla, y en ella pones SI, NO o 0, 1 si es SI/1 = no se puede modidicar ahora si es NO/0 = se puede modificar ahora... solo tendas que hacer un if, para comprobar si se puede o no if ( var1 == "0") {..... eso si, tendras que añadir a ese campo si alguien esta o no... sql update... yo hasta pondria un time, osease, hasta que el user desconecte y no pasen 10 minutos.... no se puede tocarrr |
| ||||
Eso no soluciona el problema: usuario1: recupera los datos para modificar y le contextan que tiene permiso. usuario2: hace lo mismo. aun no se han modificado y le dan permiso. usuario1: borrra los datos usuario2: intenta cambiar algun dato y ya la hemos liado |
| |||
nuevo eso no lo soluciona, porque pueden estar 20 personas, por ejemplo, a la vez obteniendo ese registro antes de que tu modifiques ese campo para decir que no se puede tocar. Un saludo. |
| ||||
Yo tb estoy trabajando con php+mysql con una base de datos bastante extensa, y la mejjor forma de controlar esto es hacer las comprobaciones necesarias tantas veces como sea necesario antes de modificar los datos...como bien dices dominguez, hay que hacerlo a mano
__________________ Lo importante no es saber sino saber el teléfono del que sabe, jajaja. |
| ||||
creo q esto de la concurrencia es algo importante.... ahora mi consulta es la siguiente, por algun modo llegue a revisar algo q se llama semaforo que incluso esta en este foro... entonces el semaforo es la solucion a esto??? pq vi que el semaforo bloque la accion asi permite que otro usuario no toque el archivo!!
__________________ Atte Real BHONOX Programador Cervecero! :borracho: Lenguajes vengan a MI!! |
| ||||
Tienes diferentes formas de controlar el acceso a secciones críticas, es decir, de controlar la concurrencia. Una es el uso de semaforos, per existen muchos más. Yo he estudiado todo esto pero para la utilización de threads que acceden a unos datos de forma concurrente. En el caso de la web, cada usuario que accede a la misma se puede tomar como un thread y por tanto a través de semaforos controlarlo. Ahora bien, no se cual sera la mejor forma de implementar un semaforo en php..... Guardar el valor en una variable de sesion? en la propia base de datos? en un fichero? si hacemos esto continuamos con el problema pq se puede dar el acceso concurrente a dicha información, así pues (como buenos informaticos, jeje) entramos en un bucle infinito...... Me esta picando la curiosidad asi q voy a consultar el manual de php que no me extrañaria que disponga de implementacion de threads..... Si os sigue interesando el tema podemos ver que solucion tiene esto, a mi me parece muy interesante ADEU
__________________ Lo importante no es saber sino saber el teléfono del que sabe, jajaja. |
| ||||
pero por lo que he visto de semaforo, bloque la opcion de un archivo y lo libera segun se cierre el navegador o expire su trabajo (esto es logicamente) fisicamente crea un archivo que cuando el usuario entra y existe tal archivo no se puede hacer nada... realmente es la unica forma que he visto y la he tratado de entender...
__________________ Atte Real BHONOX Programador Cervecero! :borracho: Lenguajes vengan a MI!! |
| ||||
he estado consultando el manual, si que dispone de semaforos, pero la verdad....esperaba encontrar algun ejemplillo, jeje. A ver si alguien sabe algo de esto que en php no me entero.... y mira que en c tengo hecho el famoso problema de los FILOSOFOS (no se si lo conocereis). enga, a seguir buscando
__________________ Lo importante no es saber sino saber el teléfono del que sabe, jajaja. |
| ||||
mira este post http://www.forosdelweb.com/showthrea...light=semaforo este es el que he estado viendo... ta bien explicado y todo... pero tambien tiene sus salvedades...
__________________ Atte Real BHONOX Programador Cervecero! :borracho: Lenguajes vengan a MI!! |
| |||
Se están complicando demasiado... la concurrencia no es asunto de php, sino del DBMS, que es el que debe tener herramientas para manejar la concurrencia y el bloqueo de registros. Si estás usando mysql deberías ver este link: http://www.mysql.com/documentation/m...ocking_methods Última edición por overlord_; 02/09/2003 a las 16:59 |
| ||||
creo q no se trata de complicarse... cuando uno crea sistemas siempre quiere realizarlo con el maximo de seguridad, ademas como no sabemos por eso preguntamos... y perdona la ignorancia pero no soy bueno para el ingles, si puedes ayudar explicando lo que quiere decir eso seria un aporte...
__________________ Atte Real BHONOX Programador Cervecero! :borracho: Lenguajes vengan a MI!! |
| |||
En toda BD en sí .. la "concurrencia" se solventa con "transacciones" (como ya han dicho) .. Mysql no las soporta de "maravilla" pero algo hace (bloquear tablas) ... Ese "bloque de tablas" .. evitará que sea accedida una tabla (o mejor aún un registro si el RDBMS lo permite .. Mysql no todavía) en un proceso de escritura por ejemplo ... (depende donde y cuando bloqueemos la tabla/campo y cuando lo liberemos). ejemplo: Usuario A .. hace un listado (SELECT) antes de entrar usuario B a editar un registro de ese listado ... En ese caso .. si pretende editar el registro X en el instante que el usuario B está -fisicamente- guardando ese regitro en la BD .. evitará que lo haga. Lo que se suele hacer en estos casos es bloquear el registro en cuestion que es editado/borrado sólo en el instante que se va guardar fisicamene el registro en la BD (sobre todo si tomamos algún "iD" por el camino de otra tabla para actualizar dicho registro) ... No es normal bloquear los "SELECT .. etc" de una tabla mientras que "fulanito" se le ocurre terminar de editar un registro .. Si lo editó antes de que otro usuario lo borrara .. y lo guarda (el registro) se creará uno nuevo (es obio que esto ha de suceder si el sistema tiene un alto tráfico sobre un mismo registro) ... Lo que si se puede es hacer consultas constantes para verificar que el dato es consistente (que existe) .. En el ejemplo anterior .. Si al editar (al pretender hacer un "UPDATE" de un registro) leo el "ID" (cualquier identificador del registro que lo identifique cómo único) .. puedo hacer un "SELECT" antes de mi "UPDATE" definitivo para ver si todavía existe ese ID que pretendo actualizar y en su defecto mostrar un mensajito tipo "este ID que está actualizando .. fué borrado por menganito" .. e incluso si guardamos fecha/hora del ultimo "UPADATE" .. podriamos decir algo como "menganito editó este mensaje en el instante que estubo editando UD. este registro" (eso actualizando un campo fecha/hora para ese registro justo al acceder al registro para editarlo ..). Con esos "avisos" ya se tomarán las acciones pertinenetes (actualizar de todas formas .. crear registro nuevo .. etc). En ese punto .. las "transacciones" es donde nos ayudaran a que si hacemos ese "SELECT .. seguido del UPDATE" sea realmente ese "ID" que existe o fué borrado .. pues solo en ese instante (microsegundos) bloquearíamos el registro/tabla para que no se peuda editar/borrar dicho registro. Un saludo,
__________________ Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo. |
| ||||
Cita: Mensaje Original por Sir Kevin Eso no soluciona el problema: usuario1: recupera los datos para modificar y le contextan que tiene permiso. usuario2: hace lo mismo. aun no se han modificado y le dan permiso. usuario1: borrra los datos usuario2: intenta cambiar algun dato y ya la hemos liado yo sigo cabezon con lo mio... aver... yo entro en un registro, y al leer el formulario en ese momento hago un update, y le digo que ya no puede nadie tocar ese registro, porq esta siendo usado... entonces, justo cuanto vuelvo hacer el update con los datos buenos, vuelvo a poner a 0 el contador... asi, jamas 2 personas pueden estar... imposible a no ser que reviente el IF y se salte las comprobaciones..... cosa que jamas deberia pasar... si, ya se que soy cabezon... pero el tema es asi... justo cuando otro user quiera modificar... no podra.. pq 1º comprobaremos ese campo, si esta en 0 o 1.... no me digan que eso no funciona.... me pego un tiro..... |
| |||
coincido con nuevo, esa es una forma simple de solucionar el problema... es tan sencillo como que a la hora de mostrar la pagina que contiene el formulario para modificar datos, solo se pueda entrar si no la ha pedido nadie antes, solo limitas el acceso a esa pagina, sino se entra ahy no se pueden modificar los datos... hasta se puede guardar un simple 0 o 1 en un archivo y no hace falta utilizar la bd... o crear un archivo y si existe pues esta restringido el paso.... eso si, el que entra o tiene que guardar los datos o pulsar a salir, o que el permiso caduque pasado una hora... |
| |||
Hola, podría tendríamos dos instrucciones una para comprobar que el dato está en la tabla y la otra que por ejemplo hace un UPDATE. Pero, podría ocurrir que entre las dos instrucciones ese registro se borre y de el error no?? es decir: ->Instrucción que comprueba si existe el dato ****Entre las dos hay un período de tiempo en el que se puede eliminar. ->Intrucción que hace el UPDATE nuevo con lo que tu planteas es lo mismo, compruebas que en el registro hay un 0, vale, por tanto está sin usar. ->Entre tú instrucción de comprobar el valor ****Entre las dos hay un período de tiempo en el que otro usuario ha podido almacenar 1 uno y eso tuya no lo tienes en cuenta no?? ->Almacenar el 1 Es decir, tu compruebas que está libre, pero antes de almacenar el 1, otro puede comprobar que está libre y ya lo estais modificando los dos. Un saludo. |
| ||||
vamos a ver si me entero pq me empiezo a perder... si yo entro para modificar ese user... automaticamente Bloqueo la entrada a los Demas..., si otro llega antes que yo y borra... que le voy hacer... eso ya no es cosa mia... el royo esq uno no pueda ni siquiera entrar pq otro ya esta dentro... es como un ascensor... si ya esta lleno... como le vas a decir a uno que salga y que entres tu... osea no, y no. si tu llegas y miras... no pasa nada... pero en el momento que entres para modificar con un form o lo que sea... haces un update aun campo X, y el que venga detras que se espere... pero asi de claro... venga.. yo pienso que este error es mas bien de calentarse los cascos un poco, y hacer una buena funcion que lo haga todo solo... y na mas... lo dicho... a ver quien es el 1º que pone aqui el code de lo que estamos hablando... menos hablar y mas treballar..jajajaj saludos a todos... |
| |||
Cita: oks entiendo lo que comentas, que la entrada a la pagina fuera simultanea... y por lo tanto la comprobacion de si hay esta permitido el paso fuera positiva para los dos...Mensaje Original por dominguez Hola, podría tendríamos dos instrucciones una para comprobar que el dato está en la tabla y la otra que por ejemplo hace un UPDATE. Pero, podría ocurrir que entre las dos instrucciones ese registro se borre y de el error no?? es decir: ->Instrucción que comprueba si existe el dato ****Entre las dos hay un período de tiempo en el que se puede eliminar. ->Intrucción que hace el UPDATE bueno pues buscando soluciones simples en php... puedes hacer otra cosa, crear otra pagina... Pagina1 -> Entra todo el que quiera, al entrar se crea un registro en la bd, en que se guarda un id, por ejemplo, y una fecha... si quieres se puede guardar una ip o un nombre de usuario y ya tienes un log de los accesos... A parte de esto... aparece en la pantalla un enlace a la segunda pagina, algo como "Comprobar el estado del registro"... Pagina2 -> La unica forma de entrar a esta pagina es por la pagina1, si quieres puedes poner un control enviando variables, por post, get o sesiones.... En esta pagina es donde se comprueba que no hay ninguna otra persona registrada en la tabla de la bd, que haga menos de una hora que este conectado (por eso guardamos la fecha)... si quieres tambien puedes olvidarte del log y simplemente mirar que no haya mas de un registro en la tabla, siempre y cuando despues borres los registros viejos... Aqui se haria la comprobacion, pero como ves ya no tenemos el problema anterior de simultaneadad... porque al llegar a la segunda pagina, ya tenemos apuntados todas las personas, si se conectaran dos personas a la primera pagina casi a la vez (a la vez es muy dificil si por ejemplo guardamos el timestamp, estamos hablando de decimas de segundo), pues solo podria entrar el primero que llego, la segunda persona en la segunda pagina, le diria que el sistema esta ocupado, ya que hay alguien que entra en menos de una hora... si pasara por ejemplo el imposible que dos personas se conectaran el mismo instante exactamente a la pagina 1, pues simplemente se tendria que implementar en la pagina 2 otro control que compruebe timestamp iguales, si son iguales, elegir uno al azar o por si a caso, denegar a los dos el paso.... En esta pagina simplemente podria aparecer algo como: "Sistema libre, pulse en el boton para entrar"... en caso de que estuviera ocupada, pues "Lo sentimos, pero el registro esta actualmente en uso, por favor intentelo mas tarde".... Pagina 3 -> Simplemente el formulario, donde igual que antes solo se puede entrar desde la pagina 2. Luego tambien puedes hacer que al guardar los datos se borre el registro de esa persona en la tabla que hemos creado en la bd, quedando libre para los siguientes... ya se que puede paracer un metodo muy cutre, si comparamos con semaforos y controles automaticos de una BD.... pero ya lo dije al principio es un metodo simple que podria funcionar |
| |||
Hola, Cita: El truco esta en hacer esos dos pasos de forma excluyente, atomica, de una forma que nadie pueda modificar el valor entre la lectura y la escritura. En http://www.mysql.com/doc/en/ANSI_diff_Transactions.html al final tienes ejemplos de como hacerlo en MySQL.nuevo con lo que tu planteas es lo mismo, compruebas que en el registro hay un 0, vale, por tanto está sin usar. ->Entre tú instrucción de comprobar el valor ****Entre las dos hay un período de tiempo en el que otro usuario ha podido almacenar 1 uno y eso tuya no lo tienes en cuenta no?? ->Almacenar el 1 Es decir, tu compruebas que está libre, pero antes de almacenar el 1, otro puede comprobar que está libre y ya lo estais modificando los dos. Por cierto, distintos motores de base de datos tienen distintos metodos. Cita: La descripcion de nuevo es basicamente la de un semaforo (o la de una zona critica).ya se que puede paracer un metodo muy cutre, si comparamos con semaforos Saludos.
__________________ Josemi Aprendiz de mucho, maestro de poco. Última edición por josemi; 05/09/2003 a las 03:45 |
| |||
Cita: al principio, entre la descripcion de nuevo y la mia no habia ninguna diferencia, solo sugeri que tambien se podia hacer por archivos y en el ultimo post he dado la solucion al problema que tenia ese sistema, pues permitia la entrada simultanea a usuarios... discrepo en cuanto que la de nuevo o la mia sean semaforos... por lo menos a mi entender, el semaforo es una parte interna del lenguaje, o sea, elementos que actuan directamente y no codigo de usuario que intenta emularlos... Mensaje Original por josemi La descripcion de nuevo es basicamente la de un semaforo (o la de una zona critica). |
| |||
Perdon, rectifico: La descripcion de nuevo y Nark es basicamente la del funcionamiento de un semaforo (o de una zona critica). Sobre que los semaforos tienen que ser una parte del lenguaje, no se que decirte. Para mi un semaforo es un metodo, una forma de hacer las cosas, no una implementacion. Eso si, si el lenguaje tiene implementado "de serie" el semaforo, mejor, te libera de muchos problemas porque la implementacion sera "mas optima" y con menos errores. Pero para mi un semaforo implementado en PHP es tan semaforo como el impementado en una extension nativa para PHP. Por cierto, creo que los semaforos son mas una caracteristica de los SO. Los lenguajes normalmente solo tienen librerias que acceden a las funciones del SO. Saludos.
__________________ Josemi Aprendiz de mucho, maestro de poco. |
| |||
Cita: Mensaje Original por josemi Perdon, rectifico: La descripcion de nuevo y Nark es basicamente la del funcionamiento de un semaforo (o de una zona critica). perdon... debi interpretar mal tu post... mi anterior post, no tenia este proposito... lo siento debi expresarme mal... Cita: Bueno, solo es una forma distinta de dar nombre las cosas, para mi un script es un script y un semaforo es un semaforo, por mucho que uno emule el otro... aunque tal como va el mundo, no nos vamos a pelear por ello, no? . Eso si, coincidimos en que implementado por el lenguaje siempre es mejor.Mensaje Original por josemi Sobre que los semaforos tienen que ser una parte del lenguaje, no se que decirte. Para mi un semaforo es un metodo, una forma de hacer las cosas, no una implementacion. Eso si, si el lenguaje tiene implementado "de serie" el semaforo, mejor, te libera de muchos problemas porque la implementacion sera "mas optima" y con menos errores. Pero para mi un semaforo implementado en PHP es tan semaforo como el impementado en una extension nativa para PHP. Cita: Efestivamente, creo que estas en lo cierto... aunque cuando programaba en ensamblador tambien exisitian unos llamados "semaforos" aunque tenian funcionalidades distintas, sobretodo informar sobre estados despues de procesar instrucciones... lo que desconozco si en ese lenguaje tambien existian algo similar a los semaforos que se empezaron pidiendo en este post. Mensaje Original por josemi Por cierto, creo que los semaforos son mas una caracteristica de los SO. Los lenguajes normalmente solo tienen librerias que acceden a las funciones del SO. |
| ||||
--------------------nuevo---------------------- yo sigo cabezon con lo mio... aver... yo entro en un registro, y al leer el formulario en ese momento hago un update, y le digo que ya no puede nadie tocar ese registro, porq esta siendo usado... entonces, justo cuanto vuelvo hacer el update con los datos buenos, vuelvo a poner a 0 el contador... asi, jamas 2 personas pueden estar... imposible a no ser que reviente el IF y se salte las comprobaciones..... cosa que jamas deberia pasar... si, ya se que soy cabezon... pero el tema es asi... justo cuando otro user quiera modificar... no podra.. pq 1º comprobaremos ese campo, si esta en 0 o 1 Mi opinion..................... Hola a todos....yo quisiera agregar algo..... Si a lo que estoy modificando....(o sea tengo un uno en mi registro para que nadie maspueda meterse a modificar ese registro) ocurre un error o se me apaga la compu.....ese campo de control queda con el valor de UNO y nadie podra accesar hasta que se meta a la base de datos y lo cambie manualmente......PUEDE OCURRIR ESO o me equivoco???
__________________ ...Hay unos que saben TODO de nada y otros que saben NADA de TODO... think about it |
| |||
Hola, eso que apuntas se solucoinaría por ejemplo con una función q al cargar cada página de la aplicación borrara aquellos registros que lleven mas de X-tiempo y ya está. Bien, creo que un UPDATE no se resuelve el problema del error, por que estas bloqueando algo que tienes que saber si se está usando, sino llega uno y hace el UPDATE pero ese registro alguien lo puede estar modificando ya. Pienso que la solución podría ir por el siguiente camino: un tabla y en ese tabla almacenar un "identificador" del objeto que se va a modificar o borrar. Ese identificador tiene que tener toda la información necesaria. Al leerlo, hay que saber el objeto que se modifica y de que tipo es.Por ejemplo, si voy a modificar un Usuario almacenar su NIF. Entonces los pasos serían: 1)Bloquear el Usuario con nif 12345678A añadiendo un registro en la tabla que antes he comentado. 2)Después de almacenar ese registro comprobar, que desde el indice 0 de la tabla hasta el mismo NO HAY un registro que tenga el mismo NIF. Es decir, asegurarte de que nadie lo esta usando. Si al consultar hay dos registros con el mismo NIF, hay que esperar, si no lo utilizo. SIEMPRE desde la 0 hasta la que inserte mi registro, de está manera NUNCA nadie estará utilizando dos objetos a la misma vez. Claro, que se me ocurre almacenar en la tabla también una identificación del que lo inserta que podría ser una variable aleatoria de un número de dígitos lo suficientemente grande como para que la posibilidad de q se repita entre dos personas en ordenadores diferentes sea despreciable, de esta manera me olvido de las posiciones de la tabla y pregunto por ese valor que se tendrá que almacenar en una variable de sesión, por ejemplo. Con este método digamos que se establecerían como una especie de prioridades y los registros los usan un usuario detrás de otro. Para que esto funcione, no se permitiría que un mismo usuario modifique o borre dos objetos a la vez. Uno llega y quiere modificar el objeto A, bien se añade un registro a la tabla. Posteriormente, compruebo si hay POR ENCIMA un registro que me indique q ese objeto se esta usando. Como no hay ninguno, adelante lo puedes manipular Objeto Usuario que lo manipula --------- ------------------------------ A 1234567890 Llega otro usuario que va a manipular le mismo objeto, bien, añadamos un registro en primer lugar SIN COMPROBAR NADA. Objeto Usuario que lo manipula --------- ------------------------------ A 1234567890 A 6789876544 Ahora hago la pregunta a la tabla, para ver si hay alguien que lo está utilizando, la respuesta sería que hasta el registro que yo he insertado hay 1 y que tengo que esperar hasta que se borre. Si llega otro mas que quiere modificar ese mismo, pues se le dice que hay dos y que espere. El ID del usuario es para establecer las PRIORIDADES de uso de ese registro. Ahora mi pregunta es:¿Hay alguna forma de hacer una consulta hasta un cierto registro de la tabla que cumpla una determinada condición? Un saludo. Última edición por dominguez; 05/09/2003 a las 12:51 |
| |||
Cita: Si te refieres el UPDATE para poner a 1 el flag, si haces:Bien, creo que un UPDATE no se resuelve el problema del error, por que estas bloqueando algo que tienes que saber si se está usando, sino llega uno y hace el UPDATE pero ese registro alguien lo puede estar modificando ya. Código PHP: El merito no es mio, es una de las cosas que comentan al final de la pagina que di antes http://www.mysql.com/doc/en/ANSI_diff_Transactions.html Saludos.
__________________ Josemi Aprendiz de mucho, maestro de poco. |
| ||||
jejejeje, tendria que ser coincidencia que los 2 pulsaran en el mismo microsegundo.... ya que un microsegundo antes o despues, php ya no lo admitiria como doble, sino como 2.... no se.. no se.. se ha dicho mucho aqui, y lo ultimo de josemi es muy interesante... la verdad,,, yo aun no me he preocupao de este tema, pero es bueno todas las explicaciones y ejemplos para un futuro muy cercano... yo sigo cabezon,,, pero me cayo ya... xxxxxddddddddd... |