Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Reserva de autoincremento

Estas en el tema de Reserva de autoincremento en el foro de Mysql en Foros del Web. Hola, estoy haciendo una webapp supersencilla a nivel de usuario, lo esoterico esta en saber antes de insertar la informacion, cual es el ID que ...
  #1 (permalink)  
Antiguo 21/04/2011, 17:41
Avatar de leac3  
Fecha de Ingreso: abril-2007
Ubicación: Valencia, pero mi mente y corazon estan en San Francisco.
Mensajes: 147
Antigüedad: 17 años
Puntos: 4
Pregunta Reserva de autoincremento

Hola, estoy haciendo una webapp supersencilla a nivel de usuario, lo esoterico esta en saber antes de insertar la informacion, cual es el ID que va a tener dicho registro. Obviamente el campo ID es un primary key con autoincremento.

La forma de buscar cual es el ultimo ID y sumarle 1 no me sirve, ya que la aplicacion es multiusuario, es decir estara en internet, y mientras hago un SELECT para conocer ese ultimo ID, ya otro usuario puede estar haciendo lo mismo, y habria incosistencia.

Es por ello que necesito saber si existe alguna forma de hacer esto de forma atomica.

Gracias de antemano, y saludos a todos los miembros de esta comunidad, de verdad que es la mejor.
  #2 (permalink)  
Antiguo 21/04/2011, 17:50
 
Fecha de Ingreso: abril-2011
Ubicación: Motril
Mensajes: 49
Antigüedad: 13 años
Puntos: 1
Respuesta: Reserva de autoincremento

Si tu tabla tiene algun campo unico, que no se vaya a repetir, esta la opcion de que una vez hayas hecho la inserccion, hagas una consulta donde selecciones el ID para la tupla insertada.

Espero que esto te sirva. yo lo he hecho, pero no siempre es válido esto
  #3 (permalink)  
Antiguo 21/04/2011, 20:17
Avatar de leac3  
Fecha de Ingreso: abril-2007
Ubicación: Valencia, pero mi mente y corazon estan en San Francisco.
Mensajes: 147
Antigüedad: 17 años
Puntos: 4
Respuesta: Reserva de autoincremento

Cita:
Iniciado por anrodse Ver Mensaje
Si tu tabla tiene algun campo unico, que no se vaya a repetir, esta la opcion de que una vez hayas hecho la inserccion, hagas una consulta donde selecciones el ID para la tupla insertada.

Espero que esto te sirva. yo lo he hecho, pero no siempre es válido esto
Si, se que con SELECT last_insert_id() obtengo el ultimo autoincrement que generó el DBMS. Pero eso en un sistema de alto trafico puede generar incosistencias.

Es por ello que ando en busca de alguna forma avanzada del SQL que me permita hacerlo de forma atomica.

A no ser que MySQL no tenga esas capacidades y Oracle si.
  #4 (permalink)  
Antiguo 21/04/2011, 20:37
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Reserva de autoincremento

Tienes que usar tablas InnoDB, de ese modo podrás usar transacciones (además de soportar restricciones de FK).
Si usas tablas MyISAM no podrás hacer nada.

PD: Eso lo podrías haber averiguado con sólo consultar el manual de referencia: MySQL AB MySQL 5.0 Reference Manual o usar Google con la pregunta adecuada: transacciones en MySQL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/04/2011, 09:24
Avatar de leac3  
Fecha de Ingreso: abril-2007
Ubicación: Valencia, pero mi mente y corazon estan en San Francisco.
Mensajes: 147
Antigüedad: 17 años
Puntos: 4
Respuesta: Reserva de autoincremento

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tienes que usar tablas InnoDB, de ese modo podrás usar transacciones (además de soportar restricciones de FK).
Si usas tablas MyISAM no podrás hacer nada.

PD: Eso lo podrías haber averiguado con sólo consultar el manual de referencia: MySQL AB MySQL 5.0 Reference Manual o usar Google con la pregunta adecuada: transacciones en MySQL
uhm ok, si, se que tiene algo que ver con transacciones pero no se que buscar ya que no estoy muy informado del tema como ya dije. Antes de acudir a este foro, siempre acudo antes a Google, por eso he de venir aqui, a los que saben; y buscar Transacciones en MySQL en Google, creo que es un tema como que muy amplio para un caso tan especifico como el mio.
  #6 (permalink)  
Antiguo 22/04/2011, 09:52
Avatar de 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, 4 meses
Puntos: 2658
Respuesta: Reserva de autoincremento

Cita:
creo que es un tema como que muy amplio para un caso tan especifico como el mio.
El problema es que precisamente tu problema está inscripto completamente en el tema transacciones.
Haciendo una visión simple, cuando declaras una transacción todas las sentencias DML de tipo INSERT/UPDATE/DELETE entran como condicionales, lo que quiere decir que los cambios producidos a las tablas no existen en forma definitiva hasta que la transacción completa no se confirma. Además, toda operación DML de un usuario concurrente queda en espera hasta que la transacción que usa las tablas no termine (confirmada o cancelada). Las´únicas operaciones accesibles son los SELECT, los cuales a su vez son inseguros hasta el final, por lo que ciertas cosas deben ser reconfirmadas cuando se liberan.
Como los autoincrementales son parte de este proceso, el uso de transacciones es una forma segura de resolver tu problema. Con el uso de tablas InnoDB el tema de la "próxima clave" tiene un capítulo propio en el Manual de referencia: MySQL Reference Manual::15.10.6. Bloqueo de la próxima clave (Next-Key Locking): evitar el problema fantasma. El método descripto creo que es suficientemente simple para que lo uses...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 22/04/2011, 10:54
Avatar de leac3  
Fecha de Ingreso: abril-2007
Ubicación: Valencia, pero mi mente y corazon estan en San Francisco.
Mensajes: 147
Antigüedad: 17 años
Puntos: 4
Respuesta: Reserva de autoincremento

eso es, gracias gnzsoloyo, ahora si me convencistes de leer ese tema, gracias, para alla voy.

  #8 (permalink)  
Antiguo 22/04/2011, 10:54
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Reserva de autoincremento

Hola,

Cita:
Iniciado por leac3 Ver Mensaje
... estoy haciendo una webapp supersencilla a nivel de usuario, lo esoterico esta en saber antes de insertar la informacion, cual es el ID que va a tener dicho registro. ...
Aplicación Web ... allí está el problema realmente. No hay base de datos que tenga esa capacidad (ni Oracle) porque la transacción se va a realizar en dos pasos en un tiempo futuro indeterminado. Posiblemente lo puedes hacer con J2EE transaccional con Enterprise Java Beans o .NET con conexiones por sesión.

Que es lo que pasa ...

1. El usuario solicita la página.
2. El servidor devuelve la página. (En este momento se calcula el proximo ID).

3. El servidor y el usuario se desconectan completamente.

4. El usuario envía la página con los datos solicitados.
5. El servidor actúa consecuentemente.
6. El servidor devuelve la respuesta.

El 'gap' está en el paso 3, no se puede mantener una transacción abierta en ese lapso de tiempo sin recurrir a servidores que tengan persistencia de conexiones por sesión o algo parecido. Si recuperas el ID en el paso 5 solamente para que cliente lo apunte, entonces no necesitas nada solamente realiza el INSERT y recupera el last_insert_id.

Saludos,

ps:

El problema es muy complicado, pero con las descripciones que das no se te puede ayudar correctamente. Por ejemplo, no dijiste porqué motivo quieres saber el número con antelación, posiblemente hay otros métodos si te tomas la molestia de explicar detalladamente el problema.

Etiquetas: Ninguno
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 10:52.