Foros del Web » Programando para Internet » PHP »

Problema con inserciones en la base de datos

Estas en el tema de Problema con inserciones en la base de datos en el foro de PHP en Foros del Web. Hola, no estoy seguro si este problema es mejor exponerlo en el foro de php o el de sql, pero puesto que el problema lo ...
  #1 (permalink)  
Antiguo 09/05/2013, 04:57
 
Fecha de Ingreso: febrero-2010
Mensajes: 45
Antigüedad: 9 años, 10 meses
Puntos: 1
Problema con inserciones en la base de datos

Hola, no estoy seguro si este problema es mejor exponerlo en el foro de php o el de sql, pero puesto que el problema lo tengo con la forma que lo planteo mediante los arhivos php me he decidido a postearlo aquí.

Tengo un archivo que hace inserciones en la base de datos del siguiente modo:

Código PHP:

$res         
mysql_query("SELECT id FROM items ORDER BY id DESC LIMIT 1"$conex);
$fila         mysql_fetch_array($res);
$Nuevo_id    $fila[0]+1;

mysql_query("INSERT INTO items (id) VALUES ('$Nuevo_id')"); 
Primero recupera el ultimo id de la tabla y posteriormente lo usa para crear el nuevo elemento, me hace falta hacerlo de este modo ya que con ese id que me devuelve luego hago más inserciones a distintas tablas.

Bueno de primeras el sistema no tiene ningúna fallo, pero el problema viene a que este archivo lo tengo que ejecutar de forma concurrente y hay veces que el archivo esta ejecutandose 3 veces al mismo tiempo realizando inserciones debido al gran volumen de datos que tiene que revisar.

Pues bién, alguna vez que otra me machaca alguna inserción puesto que la traza de los que hace es la siguiente:

- Consulta SQL para recuperar ID
- Sumar +1 al Id
- Inserción SQL con la nueva id

Al haber varias de forma concurrente, estos 3 archivos están realizando lo mismo a la vez:

Archivo 1:

- Consulta SQL para recuperar ID
- Sumar +1 al Id
- Inserción SQL con la nueva id


Archivo 2:

- Consulta SQL para recuperar ID
- Sumar +1 al Id
- Inserción SQL con la nueva id


Archivo 3:

- Consulta SQL para recuperar ID
- Sumar +1 al Id
- Inserción SQL con la nueva id

Con lo cual aveces para esto:

Archivo 1: - Consulta SQL para recuperar ID
Archivo 2: - Consulta SQL para recuperar ID

Archivo 1: - Sumar +1 al Id
Archivo 2: - Sumar +1 al Id

Archivo 1: - Inserción SQL con la nueva id
Archivo 2: - Inserción SQL con la nueva id

Con lo cual, le ha dado el mismo id al archivo 1 y 2 y la inserción del item del archivo 2 falla.

He pensado que las veces que falle haga de nuevo la consulta para recuperar el Id nuevamente y que le genere el siguiente, se me ha ocurrido mientras estaba redactando el post. Pero me gustaría saber si alguien me puede aportar alguna solución o un mejor planteamiento.
  #2 (permalink)  
Antiguo 09/05/2013, 04:59
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 9 años, 2 meses
Puntos: 331
Respuesta: Problema con inserciones en la base de datos

Consulta la sintaxis de LOCK Tables de MySQL para evitar este problema. Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 09/05/2013, 05:12
 
Fecha de Ingreso: febrero-2010
Mensajes: 45
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Problema con inserciones en la base de datos

Hola repara2,

Gracias por tu respuesta, he estado leyendo la sintaxis, por lo que he leido LOCK Tables me bloquea para que solo el archivo actual pueda realizar las operaciones sobre la tabla de lectura, escritura... y las consultas que proceden de otro flujo quedan en espera.

Me parecia una buena solución y la voy a provar para ver que tal funciona. La pega que le veo es que al mismo tiempo que estos 3 procesos estan realizando operaciones en la base de datos hay otros que también estan consultando la tabla item. Por ejemplo, la aplicación web que usan los usuarios para consultar los items y al usar Lock table estaría retrasando sus consultas también generandome un posible cuello de botella. ya que actualemente se inserta de media 1 item cada pocos segundos.

Sería bloquear la tabla antes de recuperar el ultimo id y desbloquearla despues del "INSERT" (solo se bloquearía en 2 consultas a la base de datos y rápidas), así que supongo que no se llegará a notar.

Muchas gracias.
  #4 (permalink)  
Antiguo 09/05/2013, 05:28
 
Fecha de Ingreso: febrero-2010
Mensajes: 45
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Problema con inserciones en la base de datos

El sistema me falla con LOCK TABLES

Código PHP:

$bloqueo    
mysql_query("LOCK TABLES items READ");

if(
$bloqueo){
    
    
$res         mysql_query("SELECT id FROM items ORDER BY id DESC LIMIT 1"$conex);
    
$fila         mysql_fetch_array($res);
    
$Nuevo_id    $fila[0]+1;

    
mysql_query("INSERT INTO items (id) VALUES ('$Nuevo_id')");
}

mysql_query("UNLOCK TABLES"); 
Me establoqueando el INSERT INTO del mismo hilo en el que estoy. ?Hay algún modo de bloquear la lectura en los otros hilos y que me deje hacer una inserción en el que está en ejecución?

Etiquetas: mysql, select, sql, tabla
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:22.