Foros del Web » Programando para Internet » PHP »

MySQL (no me lo supieron responder en otro foro)

Estas en el tema de MySQL (no me lo supieron responder en otro foro) en el foro de PHP en Foros del Web. MySQL: LOCK TABLES Bueno, estuve esperando alguna respuesta en el foro de DBs pero nada. Ojala alguno de ustedes pueda ayudarme, gracias. Estoy usando estas ...
  #1 (permalink)  
Antiguo 20/11/2002, 14:59
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
MySQL (no me lo supieron responder en otro foro)

MySQL: LOCK TABLES

Bueno, estuve esperando alguna respuesta en el foro de DBs pero nada. Ojala alguno de ustedes pueda ayudarme, gracias.

Estoy usando estas lineas:

$sql="LOCK TABLES banners READ";
@mysql_query($sql,$link) or die("Query 1 failed");
$sql="UPDATE banners SET clicks=85 WHERE id=1";
@mysql_query($sql,$link) or die("Query 2 failed");
$sql="UNLOCK TABLES";
@mysql_query($sql,$link) or die("Query 3 failed");

pero resulta que me falla el query 2. Si no LOCKEO la tabla hace bien el UPDATE. Y si pongo en vez de READ, WRITE, el que me falla es el query 1.

Que estoy haciendo mal?
  #2 (permalink)  
Antiguo 20/11/2002, 15:25
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No se intermante como funciona el tema de LOKear tablas Mysql .. pero si que puedes probar a ver q mensaje de error da Mysql en el seguno query; quitando los @ de las funcioenes y añadiendo un:

en vez de:
or die("Query 2 failed");

usar:
or die("mysql_error()");

Eso en teoria deberia decirte el error exacto q proboca Mysql en ese punto .. con eso será mas facil buscar alguna solución ...

Un saludo,
  #3 (permalink)  
Antiguo 20/11/2002, 15:39
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Tampoco yo acostumbro a usar LOCK, pero me parece que para el codigo que pones no hace falta usarlo. Hasta donde yo se, el UPDATE es atomico, es decir, se ejecuta de una vez. Esto significa que no se ejecuta otra consulta en mitad de la ejecucion del UPDATE.

Pero como tampoco se que es lo que exactamente estas haciendo con ese codigo, quizas en tu caso si necesitas el LOCK.

Y sobre el error, puede ser que le afecte alguna otra operacion que hayas realizado sobre la BD en el script.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 20/11/2002, 20:03
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Ok Cluster, en unos minutos pruebo lo de mysql_error(), siempre lo olvido
josemi: el etma es este... se trata de una estadistica de clicks, y cada banner tiene un registro. Para incrementar el valor al hacer un click, primero debo leer y luego hacer el update. Lo que quiero es bloquear al leer para que nadie haga nada hasta que se termine el update.
Porque podria pasar lo siguiente:
Supongamos que el contador esta en 0.
Si dos usuarios hacen click, deberia pasar a 2.
Pero que pasa si los tiempos hacen que siceda esto:

Lectura de usuario1
Lectura de usuario2
Update de usuario1
Update de usuario2

Entoces el total quedaria como 1, y no 2 como deberia ser.

Esto es intuitivo, yo creo que podria pasar tranquilamente, lo que no se es si hay otra forma de hacer estadisticas y que no tengan este problema. Si conocen otra forma, escucho atento.
  #5 (permalink)  
Antiguo 20/11/2002, 23:22
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Estuve leyendo el manual de mysql, que no entiendo mucho porque 0 de ingles y llegue a una conclusion, espero que alguien que sepa pueda corregirme o darme la razon:

Al ejecutar LOCK TABLES tabla READ lo que se hace es PERMITIR SOLO LA LECTURA DE LA TABLA, HASTA PARA LA PAGINA QUE EJECUTO EL QUERY.
Si en cambio se ejecuta LOCK TABLES tabla WRITE, SE BLOQUEA LA LECTURA Y ESCRITURA PARA OTRAS PAGINAS, PERO AMBAS OPERACIONES ESTAN PERMITIDAS EN LA PAGINA ACTUAL.

Llegado a esta conlusion, y si nadie me corrige, creo que lo que busco es LOCK TABLES tabla WRITE.
  #6 (permalink)  
Antiguo 21/11/2002, 14:49
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

Bien, mi comentario sobre si se podia hacer sin LOCK era porque en el codigo no ponias la consulta de lectura. En tu caso tendrias que hacer:

LOCK
leer el dato
modificar el dato
UNLOCK

Pero sigo diciendo que no es necesario el LOCK, si lo unico que haces es incrementar en uno el valor. Usando esta consulta:

UPDATE banners SET clicks=clicks+1 WHERE id=1

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 21/11/2002, 15:37
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Jeje, entonces me estoy perdiendo de algo.
Acaso se puede incrementar un valor dentro de una SQL sin saber previamente que valor tenia antes?
  #8 (permalink)  
Antiguo 21/11/2002, 15:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La sentencia SQL q te puso josemi hace eso .. extrae el valor de ese campo y le asigna otro valor .. en este caso lo incrementa en una unidad ...

Lo mismo puedes hacer cualquier funcion tanto de tratamiento de cadenas como de numeros y fechas desde Mysql (SQL directo) ...


Un saludo,
  #9 (permalink)  
Antiguo 21/11/2002, 17:59
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 15 años, 6 meses
Puntos: 0
Muy bueno, eso no lo sabia...
Pero igualmente temo que tendre que bloquear, porque igualmente antes que nada hago un SELECT para saber si existe ya algun registro con el nombre del banner, y si no existe hago un INSERT INTO.
Creo, corrijanme por favor, que si pasa esto:

Lectura de usuario1
Lectura de usuario2
INSERT de usuario1
INSERT de usuario2

Se agregarian dos registron de un mismo banner, no es asi?
Claro que puedo generarlos yo previamente a mano, pero no quisiera hacerlo.
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 01:51.