Tema: Ultimo id
Ver Mensaje Individual
  #5 (permalink)  
Antiguo 04/07/2011, 07:52
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: Ultimo id

OK. Entonces lo que necesitas hacer a nivel de bases de datos, es un boqueo de actualización, cosa que puedes hacer declarando una transacción o bien haciendo un SELECT ... FROM ... FOR UPDATE, como puedes encontrar descripto en el manual de referencia (15.10.6. Bloqueo de la próxima clave (Next-Key Locking): evitar el problema fantasma).
La transacción tiene la ventaja de no tener que definir nada. Alcanza con usar el .BeginTransaction de la clase MysqlConnection, pero el inconveniente de que bloquea todas las tablas para actualización. En cambio, el SELECT ... FOR UPDATE puede requerir leer previamente la tabla y la ventaja de sólo bloquear una única tabla.
Si no vas a usar usuarios concurrentes, no hay problema, usa cualquiera. Si tienes usuarios concurrentes, la cosa se complica. Puede ser que bloquear la tabla sea más eficiente.

Cualquiera que sea el caso, hay una cosa que tendrás que tener en cuenta: Tanto la conexión con los objetos que lean la base de datos no pueden ser transitorios, es decir, no pueden ser objetos creados en un método o una función en forma local. Tienen que ser objetos permanentes de la clase o de la aplicación, por cuanto la destrucción del objeto conexión, el de transacción y los lectores, conllevan una implícita cancelación de la transacción (ROLLBACK) y la consiguiente liberación de todos los bloqueos.
Normalmente, la mejor forma de solucionar esto es que todo lo que sea manejo de la base de datos debe ser una clase específica, y se debe instanciar una sola vez en la aplicación para cada sesión de cada usuario, y ser permanente mientras la sesión del usuario exista.
De ese modo podrás llamar al objeto desde cualquier parte de la aplicación y no tendrás que abrir múltiples veces las conexiones, o crear en diferentes funciones y métodos los objetos necesarios. Así, el manejo de una transacción se vuelve más simple.
El problema de no hacerlo de este modo y simplemente abrir la base, leer el último ID y luego cerrar la conexión, es que si tienes usuarios concurrentes, puede que otro usuario esté haciendo la misma tarea; al hacerlo, si él inserta el registro antes que tu, al pretender insertarlo por tu cuenta estarán usando el mismo numero de ID, y como ese numero es una PK, sencillamente te dará un error de clave duplicada, y no insertará el registro.
¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)