Ir al contenido


Foto

Bloqueo de auto_increment en una tabla


  • Por favor identifícate para responder
7 respuestas en este tema

#1 manuel001

manuel001

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 18 julio 2014 - 11:13

Buen día estimados.

Necesito de su experiencia.

Dentro de una base de datos, tengo una tabla con un campo auto_increment este es primary key de dicha tabla (esta tabla tiene un motor de almacenamiento MyISAM)

Cuando voy a ingresar un nuevo registro, hago que me muestre el id a tomar del campo auto_increment con esta consulta: Select auto_increment from `information_schema`.tables where TABLE_NAME = 'mitabla';

El Problema es:
Hay varios usuarios que ingresan registros al mismo tiempo, y tengo inconsistencia de datos, porque cogen el mismo id del auto_increment.

Como evito eso?, debo bloquear la tabla hasta que el primero que cogio el auto_increment termine? , hay otra manera de hacerlo.

Les agradecería mucho mostrármelo en un ejemplo, perdon por mi inexperiencia pero estoy avanzando en eso.

Desde ya gracias por su ayuda.
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 julio 2014 - 06:44

No mostrar el numero del incremento, solo obtenlo al momento de ingresar, asi las probabilidades de chocar son de el 0.01%, ahora, no has especificado en que lenguaje atacas a MySQL, Delphi o PHP.

Saludos.
  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 19 julio 2014 - 08:07

O después de guardar en la base de datos muestra al usuario el consecutivo que el sistema le asignó a su información...

No mostrar el numero del incremento, solo obtenlo al momento de ingresar, asi las probabilidades de chocar son de el 0.01%, ahora, no has especificado en que lenguaje atacas a MySQL, Delphi o PHP.

Saludos.


Excelente pregunta, con qué lenguaje estás trabajando ?

Saludox ! :)
  • 0

#4 manuel001

manuel001

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 19 julio 2014 - 09:06

Gracias por responder estimados.

Perdón por no especificar, estoy trabajando con PHP y MySQL.

Les comento que necesito mostrar al usuario el id que tomara su registro antes de guardarlo, es por les muestro el auto_increment.
pero tengo problemas como les comente, porque mientras un usuario tomo ese id y esta demorando en darle guardar, otro tambien tomo ese mismo id.

  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 julio 2014 - 09:28

El problema está justamente en que definiste a la PK como autoincremental.
Si incialmente cosultas el valor a tomar para mostrarlo y hay varios puestos que lo capturan, y todos intentan usarlo para hacer un insert naturalmente vas a tener problemas. No puede haber en una PK duplicados. Por ejemplo, digamos que el último valor fue 6, y resulta que hay 4 puestos que han consultado este valor. Ellos saben que hasta el momento se han insertado 6 registros. Cada uno asume entonce que podrá poner el 7mo con el ID=7.
El puesto que sea más rápido meterá ese registro, y los demás cuando intenten poner con el mismo ID recibirán un error.

O bien, no muestras el valor o no uses un autoincremental. Combinar ambas cosas no es bueno. La solución no pasa por bloquear el autoincremental... es volver a la época de los primeros motores de base de datos que utilizaban las técnicas de bloqueo pesimistas.  Hoy en día antes que pensar en un bloqueo se debería revisar mejor que es lo que se pretende hacer.

Si en verdad necesitas capturar el "siguiente" valor, deberás hacerlas cosas por otras vías.
Algunas propuestas:
1) en lugar de tener el campo como autoincremental utiliza una tabla auxiliar que lleve la cuenta. Cada vez que se consulte en este tabla, se vaya actualizando el valor por un +1. De este modo cada puesto a leerla obtendrá uno diferente.
2) Muestra el dato temporalmente y un aviso indicando que temporalmente, hasta el momento, se asignará ese valor. Luego captura si hubo un error de inserción cuando el usuario confirme y muestra un aviso informando que lamentablemente ya alguien le ganó de mano ese ID y le avisas cual es que le terminó correspondiendo.

Saludos,
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 julio 2014 - 09:32

Si un sistema es multi-usuario no es recomendable mostrar el ID, eso es mas bien para sistema mono-usuario (1 solo usuario), siempre te va a dar inconvenientes en el asunto de los auto-incrementos, si se resolviera el problema (en tu caso se puede) siempre habran saltos numericos, del id 1 puede saltar al 5 y del 5 al 7 donde se perderian los id 1,2,3,4 y 6, me captas?, es altamente recomendable mostrar el ID luego que se ingresa, y segundo usa la funcion mysql_insert_id.

Saludos.
  • 0

#7 manuel001

manuel001

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 19 julio 2014 - 09:53

Tienes razon enecumene los sistemas tumultuarios no muestra el id a tomar, para esto tendría ejecutar mi consulta enviando ese campo con un NULL para que me coja el siguiente auto_incremente, sin ningun inconveniente.

Sin embargo lo usuarios quieren que les muestre el id a tomar, entonces queda perfecto la segunda idea de Delphius que temporalmente les muestre el id a tomar y si alguien guardo primero les saldrá un mensaje de error.

Muy agradecido señores, un abrazo afectuoso desde Trujillo-Perú  (y)
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 julio 2014 - 12:51

O directamente muéstrales el valor definitivo, el ya insertado, y no el "temporal".
Los campos con claves artificiales, como el famoso ID que tan acostumbrados estamos a usar, como lo dice el nombre son artificiales. No están pensados para que el usuario se los recuerde, ni tenga que estar poniendolo. Justamente al ser artificial la idea es que el sistema permita llevar la cuenta y poder identificar de forma inequívoca cada registro.
Luego es que si el usuario desea agilizar ciertas operaciones (sobre todo las de búsquedas) puede ser útil memorizarse algunos IDs pero en principio no tienen valor real... es sólo "organizacional".

Saludos,

  • 0




IP.Board spam blocked by CleanTalk.