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

autoincrement

Estas en el tema de autoincrement en el foro de Mysql en Foros del Web. Hola a todos lo que andan por aquí. Ten una duda actualmente tengo dos tablas por ejemplo una de factura y otra del detalle (para ...
  #1 (permalink)  
Antiguo 06/03/2012, 18:15
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 14 años, 7 meses
Puntos: 0
Información autoincrement

Hola a todos lo que andan por aquí.

Ten una duda actualmente tengo dos tablas por ejemplo una de factura y otra del detalle (para estar mas familiarizado) actualmente todo se hace desde php y el proceso para la insercion de registros en esas tablas es el siguiente

inserto en la tabla factura el cual contien el ID que es autoincrement, despues hago un select max(id) a la tabla factura para saber cuales el ultimo ID insertado y posterior a eso inserto en la tabla de detalle el id para tener la relacion.

Como ven el proceso esta bien, pero creo que no es lo mejor ya que puede que dos usuarios corran ese mismo proceso casi al mimso tiempo y se pieda la integridad de mi base de datos.

Mi pregunta es

Si el insert lo hago utilizando un procedure es menos problable que se pierda la integridad de mi base o que es lo mejor para estos casos?


Saludos y gracias!!!
  #2 (permalink)  
Antiguo 07/03/2012, 04:00
 
Fecha de Ingreso: diciembre-2011
Mensajes: 35
Antigüedad: 12 años, 4 meses
Puntos: 2
Respuesta: autoincrement

Hola calakra:

Así a bote pronto se me ocurren 2 soluciones distintas:

- Si estás empleando unas tablas de tipo MyISAM puedes hacer el SELECT del ID haciendo referencia a los demás campos que has insertado. Es decir, si buscas por descripción, fecha, hora de la inserción, etc, es más probable que te hagas con el ID correcto.

- No estoy 100% seguro, pero para estos casos se podría emplear tablas innoDB, las cuales permiten ejecutar varias consultas al mismo tiempo de un bloque, de manera que mientras se ejecutan la tabla queda bloqueada de manera que nadie más puede actuar sobre ella. Te repito, lo leí hace tiempo pero no estoy completamente seguro, pero lo veo la vía más factible.


Echa un vistazo y nos cuentas!
  #3 (permalink)  
Antiguo 07/03/2012, 04:06
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, 5 meses
Puntos: 2658
Respuesta: autoincrement

Cita:
Como ven el proceso esta bien, pero creo que no es lo mejor ya que puede que dos usuarios corran ese mismo proceso casi al mimso tiempo y se pieda la integridad de mi base de datos.
Para eso se inventaron las transacciones.
15.10. Bloqueo y modelo de transacciones de InnoDB
Leelo, trata de comprenderlo y luego pregunta tus dudas. Es muy largo para explicarlo en un sólo post.
Préstale especial atención al tema "Bloqueo de la próxima clave (Next-Key Locking): evitar el problema fantasma"
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 07/03/2012, 10:25
Avatar de calakra  
Fecha de Ingreso: septiembre-2009
Mensajes: 182
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: autoincrement

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Para eso se inventaron las transacciones.

Leelo, trata de comprenderlo y luego pregunta tus dudas. Es muy largo para explicarlo en un sólo post.
Préstale especial atención al tema "Bloqueo de la próxima clave (Next-Key Locking): evitar el problema fantasma"

Hola.

Gracias por la liga, y tengo varias dudas, acerca del rollback o commit

Si irealizo un select no es necesario iniciar una transaccion con begin ¿Es correcto?

Para realizar inserts,delets, update si es necesario el begin y su terminacion (commit o rollback segun sea el caso) ¿es correcto?

¿Si se Inhabilita AUTOCOMMIT es necesario siempre empesar una consulta con begin aunque sea solo un select?
si la respuesta es si a la anterior, entonces es recomendable usar procedure en lugar de las sentencias normales?
  #5 (permalink)  
Antiguo 07/03/2012, 10:55
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, 5 meses
Puntos: 2658
Respuesta: autoincrement

Cita:
Si irealizo un select no es necesario iniciar una transaccion con begin ¿Es correcto?
Es correcto, pero si hay concurrencia de usuarios la información puede no ser fiable.
Ese tipo de cosas se analiza en el tema de ISOLATION LEVEL.
Cita:
Para realizar inserts,delets, update si es necesario el begin y su terminacion (commit o rollback segun sea el caso) ¿es correcto?
Correcto. el START TRANSACTION hace que toda otra operación I/U/D, espere hasta que se ejecute el COMMIT o ROLLBACK. Las operacioens de otros usuarios quedan en espera y luego se les va cediendo el control en el mismo orden en que entraron.
Cita:
Si se Inhabilita AUTOCOMMIT es necesario siempre empesar una consulta con begin aunque sea solo un select?
Con el AUTOCOMMIT en OFF, es como si cada serie de setencias entre COMMITs comenzaran con un START TRANSACTION. Pero no el SELECT. El SELECT se ve afectado de otra forma, como ya mencioné.

Cita:
si la respuesta es si a la anterior, entonces es recomendable usar procedure en lugar de las sentencias normales?
Hay muchas razones para afirmar que los SP son de una gran utilidad y traen beneficios, pero no son exacta,ente lo mismo que las transacciones. De hecho, puedes abrir y cerrar una transacción dentro o fuera del SP.
Lo único que no puedes hacer es crear transacciones anidadas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: insert, autoincrementable
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 23:25.