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')");
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.