Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Una pregunta sobre MySQL!!!!!

Estas en el tema de Una pregunta sobre MySQL!!!!! en el foro de Mysql en Foros del Web. Hola!!!! Estoy utilizando MySQL en Asterisk, me gustaría saber si puedo invocar al mismo tiempo, desde dos lugares diferentes a la misma base de datos ...
  #1 (permalink)  
Antiguo 09/06/2009, 16:04
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Una pregunta sobre MySQL!!!!!

Hola!!!!


Estoy utilizando MySQL en Asterisk, me gustaría saber si puedo invocar al mismo tiempo, desde dos lugares diferentes a la misma base de datos MySQL y la misma tabla.

Deseo programar eventos en Asterisk, entonces tengo una página en PHP (digamos que se llama uno.php) que consulta a la base de datos y luego empieza a hacer llamadas. Por otro lado, otro archivo .php (digamos que se llama dos.php) se encarga de receptar dichas llamadas y consulta y escribe en la misma base de datos.

Es esto posible? que dos archivos .php diferentes esten activamente cambiando una base de datos? si esto no fuere posible, de qué otra manera podría hacer esto?




muchas gracias por su atencion :)
  #2 (permalink)  
Antiguo 09/06/2009, 16:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Una pregunta sobre MySQL!!!!!

Puedes, pero requiere manejar transacciones y lo que se denomina "concurrencia", para evitar que dos usuarios realicen tareas de actualización en la misma tabla simultaneamente, porque eso podría producir inconsistencias gravísimas en los datos.
Aquí tienes un link que te aclara un poco el tema: Transacciones y Concurrencia
Lee en especial : 10.4.1 Manejo de transacciones en SQL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/06/2009, 17:00
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Una pregunta sobre MySQL!!!!!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Puedes, pero requiere manejar transacciones y lo que se denomina "concurrencia", para evitar que dos usuarios realicen tareas de actualización en la misma tabla simultaneamente, porque eso podría producir inconsistencias gravísimas en los datos.
Aquí tienes un link que te aclara un poco el tema:
Lee en especial : 10.4.1 Manejo de transacciones en SQL

gracias por contestar y por el link!

Otra pregunta: cuando hablas de "varios usuarios" te refieres a los usuarios que utilizan la base o dos instancias diferentes que utilicen la base?

Pregunto porque es el mismo usuario "root" el que inicia sesion (igual solo planeo incluir ese usuario). tanto "uno.pho" como "dos.php" realizan una conexión a la base con el mismo user root y su respectivo password. A esto también se le aplica lo de concurrencia?

muchas gracias
  #4 (permalink)  
Antiguo 10/06/2009, 06:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Una pregunta sobre MySQL!!!!!

Hablemos un poco sobre este tema, tratando de simplificar:
1. No es buena idea que dos usuarios se logueen a una base con el mismo nombre de usuario.
2. No es buena idea, en realidad es pésima idea, que usen el usuario root para hacer enlaces a la base. El usuario root es el superusuario de más alto nivel y tiene permisos hasta para eliminar la base, tablas, datos otros usuarios... es decir, si pones el usuario root y su password en una aplicación php en un host de web, te expones a que eventualmente alguien pueda tomar el control de tu base y simplemente eliminarla. Es lo mismo que entregarle a un desconocido la llave y la dirección de tu casa.
3. Los sistemas de gestion de bases de datos (SGBD o DBMS, como se denominan genéricamente) como MySQL, Oracle, DB2, etc., permiten configurar la capacidad de accesos y los permisos de trabajo para un usuario. En ese contexto, es posible dejar que un usuario pueda loguearse muchas veces en forma simultánea en diferentes puestos, con el mismo username y el mismo password. Es el DBA quien tiene que definir ese tema para cada usuario.
4. Si se permite ese multilogueo, y como es el mismo username, tiene permiso para hacer las mismas cosas con todas las tablas... Imagínate los problemas que eso causa.
5. Cuando se habla de concurrencia se está diciendo que dos procesos (hilos de tarea en un programa) están llamando a la misma tabla o procedure de la base al mismo tiempo. Como cada hilo de proceso está siendo usado desde una IP distinta, las respuestas de la base se dirigen a una o a otra, según cuál hizo qué pedido. Como las tareas "concurren" hacia un mismo elemento de la base, se denominan concurrentes.
6. La concurrencia puede hacer que en un momento dado, un usuario borre un registro, mientras otro lo está actualizando, por ejemplo. En ese caso, ¿en qué estado queda? ¿actualizado o borrado? En un caso así, si la acción inicial fue la lectura para actualizar y antes de grabar, el usuario 2 borra el registro, cuando el 1 manda a grabar, la base no encuentra el registro y el proceso colapasa... ¿Se entiende? Ese caso es crítico, pero se puede dar que dos intenten actualizar al mismo tiempo: Imagínate si dos personas quieren retirar al mismo tiempo todos los fondos de una cuenta. ¿Quién retira y a quién se le dice que no hay plata, si un instante antes había?

Resumiendo:
1. No uses el root.
2. El login debe incluir de parte de los usuarios: username y password.
3. Crea un usuario que no sea root con permisos de crear usuarios.
4. Ese usuario puedes incrustarlo en el PHP, sólo para hacer que los usuarios de la web se suscriban y se den de alta.
5. Una vez hecha el alta, que se logueen, pero esos usuarios no tendrán los permisos de root.
6. Esos usuarios no deben poder loguearse más de una vez al mismo tiempo.

Referente a los procesos:
1. Cuando un usuario lee una tabla para cambiar algo (insertar, borrar o actualizar), debe usarse un LOCK a esa tabla.
2. En los store procedures, deben usarse transacciones.

Sobre los permisos: 13.5.1.3. Sintaxis de GRANT y REVOKE

Sobre concurrencia y bloqueos de tablas: 1.7.5.3. Transacciones y operaciones atómicas

Sobre generar formularios de login y de altas de usuarios, consulta en el Foro de PHP, porque eso no es cosa de la base. En la base se crean los usuarios, no los formularios.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 10/06/2009, 23:20
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Una pregunta sobre MySQL!!!!!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Hablemos un poco sobre este tema, tratando de simplificar:
1. No es buena idea que dos usuarios se logueen a una base con el mismo nombre de usuario.
2. No es buena idea, en realidad es pésima idea, que usen el usuario root para hacer enlaces a la base. El usuario root es el superusuario de más alto nivel y tiene permisos hasta para eliminar la base, tablas, datos otros usuarios... es decir, si pones el usuario root y su password en una aplicación php en un host de web, te expones a que eventualmente alguien pueda tomar el control de tu base y simplemente eliminarla. Es lo mismo que entregarle a un desconocido la llave y la dirección de tu casa.
3. Los sistemas de gestion de bases de datos (SGBD o DBMS, como se denominan genéricamente) como MySQL, Oracle, DB2, etc., permiten configurar la capacidad de accesos y los permisos de trabajo para un usuario. En ese contexto, es posible dejar que un usuario pueda loguearse muchas veces en forma simultánea en diferentes puestos, con el mismo username y el mismo password. Es el DBA quien tiene que definir ese tema para cada usuario.
4. Si se permite ese multilogueo, y como es el mismo username, tiene permiso para hacer las mismas cosas con todas las tablas... Imagínate los problemas que eso causa.
5. Cuando se habla de concurrencia se está diciendo que dos procesos (hilos de tarea en un programa) están llamando a la misma tabla o procedure de la base al mismo tiempo. Como cada hilo de proceso está siendo usado desde una IP distinta, las respuestas de la base se dirigen a una o a otra, según cuál hizo qué pedido. Como las tareas "concurren" hacia un mismo elemento de la base, se denominan concurrentes.
6. La concurrencia puede hacer que en un momento dado, un usuario borre un registro, mientras otro lo está actualizando, por ejemplo. En ese caso, ¿en qué estado queda? ¿actualizado o borrado? En un caso así, si la acción inicial fue la lectura para actualizar y antes de grabar, el usuario 2 borra el registro, cuando el 1 manda a grabar, la base no encuentra el registro y el proceso colapasa... ¿Se entiende? Ese caso es crítico, pero se puede dar que dos intenten actualizar al mismo tiempo: Imagínate si dos personas quieren retirar al mismo tiempo todos los fondos de una cuenta. ¿Quién retira y a quién se le dice que no hay plata, si un instante antes había?

Resumiendo:
1. No uses el root.
2. El login debe incluir de parte de los usuarios: username y password.
3. Crea un usuario que no sea root con permisos de crear usuarios.
4. Ese usuario puedes incrustarlo en el PHP, sólo para hacer que los usuarios de la web se suscriban y se den de alta.
5. Una vez hecha el alta, que se logueen, pero esos usuarios no tendrán los permisos de root.
6. Esos usuarios no deben poder loguearse más de una vez al mismo tiempo.

Referente a los procesos:
1. Cuando un usuario lee una tabla para cambiar algo (insertar, borrar o actualizar), debe usarse un LOCK a esa tabla.
2. En los store procedures, deben usarse transacciones.

Sobre los permisos: 13.5.1.3. Sintaxis de GRANT y REVOKE[/URL]

Sobre concurrencia y bloqueos de tablas: [

Sobre generar formularios de login y de altas de usuarios, consulta en el Foro de PHP, porque eso no es cosa de la base. En la base se crean los usuarios, no los formularios.
Agradezco mucho tus consejos y la información... Lo pondré en práctica :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:57.