Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/02/2011, 10:46
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Insertar campo que va en consecutivo y traer el Nº correcto

El problema de concurrencia de usuarios en tareas de inserción/borrado de datos en un DBMS no se resuelve por uso de autoincrementales o de consultas. Se resuelve usando transacciones, y eventualmente en algunos casos (Oracle, por ejemplo) usando secuencias, con las que se puede hacer una reserva del siguiente ID, por ejemplo.

En el caso del uso de transacciones (la mejor forma), la concurrencia se resuelve prácticamente sola, porque es imposible que dos registros se inserten al mismo tiempo. El valor del ID de esa tabla surge solamente cuando se ha producido la inserción exitosa, por lo que en el caso de ser autoincrementales, cada inserción devolverá, sin importar quién la hace, un resultado diferente.

Usar solamente campos autoincrementales no asegura absolutamente nada en la concurrencia si la consulta del valor máximo de ese ID no se realiza con bloqueo de escritura. Si no se bloquea la tabla, y se va a manejar el ID programáticamente, puede darse el caso de que dos usuarios consulten al mismo tiempo el valor y por ende intenten adicionar el mismo valor de ID futuro...

La solución, por donde lo mires, son las transacciones.

Nota:
En el caso específico de MySQL el uso de transacciones requiere que las tablas sí o sí sean InnoDB y no MyISAM.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)