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

Concurrencia con Mysql

Estas en el tema de Concurrencia con Mysql en el foro de Mysql en Foros del Web. Buenas amigos... Tengo un problema que espero tenga alguna solución, porque sino estoy muy pero que muy jodi... Os pongo en situacion. Aplicación multiusuario En ...
  #1 (permalink)  
Antiguo 24/10/2008, 01:49
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 16 años, 4 meses
Puntos: 5
Concurrencia con Mysql

Buenas amigos...

Tengo un problema que espero tenga alguna solución, porque sino estoy muy pero que muy jodi...

Os pongo en situacion.

Aplicación multiusuario

En esta aplicación hay una lista de contactos de los cuales puedo seleccionar uno para editarlo.

Para ello llamo a editarForm.php?id_contacto=X

En este archivo
- Hago el select con id_contacto
- Relleno los values de los inputs del formulario segun el resultado de la consulta
- En el action del form mando a actualiza.php

actializa.php

- Realizo el Update
- Vuelvo al Index por medio de un header

PROBLEMA

Lo que yo busco es bloquear el registro que yo voy a actualizar.De tal forma que si el usuario A va a editar el registro 345, mientras este en editar.php haciendo los cambios al registro un usuario B que intente editar ese mismo registro de un error que yo pueda controlar sacando un mensaje del tipo
(Registro Bloqueado,intentelo mas tarde)
Y cuando el usuario A actualiza el registro en la pagina actualiza.php desbloquee dicho registro.

Espero haberme explicado bien

Pense en LOCK TABLE, pero nada. Yo hago el LOCK en editar.php y me bloquea mientras el servidor genera la página pero cuando el sevidor me envia la pagina ya ha terminado y no hay bloqueo.

Pense en una tabla de control,pero esto es una chapuza. ¿Que pasa si un usuario tiene una tabla cogida y se cuelga el ordenador? Problemas...

Ayudenme please...

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #2 (permalink)  
Antiguo 24/10/2008, 04:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Concurrencia con Mysql

La cosa se puede manejar, en principio, de dos formas:
1. Usando un Store Procedure. Como los SP corren en servidor, el bloqueo se inicia y se termina dentro del SP, de modo que la consistencia de la tabla es segura. Esta opción requiere que el server de MySQL en el host sea 5.0 o superior.
2. Usando transacciones. Una transacción es una operación ACID que bloquea por default las modificaciones a la tabla en cuestión. Eso requiere que el motor del host sea InnoDB. Si es una base en web, es probable que tenga MyISAM y no InnoDB por cuestiones de eficiencia. Deberás consultar al proveedor.

Puedes controlar el asunto por código, pero, como dices, eso es medio chapucero...

Respecto al control del bloqueo, La administración del estado de la tabla simplemente lo puedes manejar por el error devuelto por MySQL al intentar acceder a una tabla bloqueada.
Simplemente tienes que fijarte en el número de error devuelto en el listado de errores del manual de referencia.
__________________
¿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 24/10/2008, 07:18
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: Concurrencia con Mysql

Gracias gnzsoloyo por contestar

En cuanto a la 1ª opción, ¿sería mucho pedir un ejemplo sencillo o algun enlace a manual o algo asi?Te lo agradecería mucho

En cuanto a la 2ª opción. No se si me serviria ya que en un archivo hago el select (momento en que se ha de bloquear) y en otro hago el update (moomento del desbloqueo), es decir que tendría que empezar la transacción en uno y terminar en el otro. No se si esto se puede hacer o no????

Por otro lado, el bloqueo que estamos hablando sería de una tabla, lo que a mi me interesa sería bloquear un registro concreto de una tabla

gracias de antemano.

Voy a investigar la 1ª opción

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #4 (permalink)  
Antiguo 24/10/2008, 07:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Concurrencia con Mysql

Cita:
En cuanto a la 2ª opción. No se si me serviria ya que en un archivo hago el select (momento en que se ha de bloquear) y en otro hago el update (moomento del desbloqueo), es decir que tendría que empezar la transacción en uno y terminar en el otro. No se si esto se puede hacer o no????
Precisamente para ESO existen las transacciones: Para hacer un conjunto de operaciones DML como si fuesen una sola.

Cita:
En cuanto a la 1ª opción, ¿sería mucho pedir un ejemplo sencillo o algun enlace a manual o algo asi?Te lo agradecería mucho
Antes de darte esa opción te recuero que hay que verificar la versión de MySQL que tiene instalado el Host. Esto es importante, porque hay muchos host en al web que aún usan el MySQL 4.0.22, que no soporta SP.

Cita:
Por otro lado, el bloqueo que estamos hablando sería de una tabla, lo que a mi me interesa sería bloquear un registro concreto de una tabla
Bueno, eso requiere si o si el motor InnoDB. MyISAM creo que no soporta bloqueos a nivel de registro.
__________________
¿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 24/10/2008, 07:55
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: Concurrencia con Mysql

Cierto se me olvido comentarte...empleo mysql 5.1.25 y tablas innoDB

gracias por tu interes

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #6 (permalink)  
Antiguo 24/10/2008, 10:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Concurrencia con Mysql

Bueno, lo básico de Store Procedures lo encuentras en el manual: Capítulo 19. Procedimientos almacenados y funciones.
Fuera de eso, encontrarás bastante en internet sobre el tema, ya que es uno de los cambios más importantes que tuvo MySQL al pasar a la versión 5.0
Aquí tienes algunso links posibles:
Llamar store procedure de MySQL desde PHP.
Manual de Stored Procedures en MySQL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 22:26.