Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/05/2013, 03:57
xorow
 
Fecha de Ingreso: febrero-2010
Mensajes: 45
Antigüedad: 14 años, 2 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.