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

Duda sobre ID's

Estas en el tema de Duda sobre ID's en el foro de Mysql en Foros del Web. Hola buenas, Tengo una tabla CONTADORES en la que guardo los nombres de tablas y el ID actual de cada una de ellas. En primer ...
  #1 (permalink)  
Antiguo 27/05/2009, 03:40
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Duda sobre ID's

Hola buenas,

Tengo una tabla CONTADORES en la que guardo los nombres de tablas y el ID actual de cada una de ellas.

En primer lugar, cada vez que voy a insertar un registro en una determinada tabla, busco en la tabla CONTADORES el que corresponde a la tabla en la que quiero insertar y con un update incremento su campo 'idActual'.

Después hago una select también sobre CONTADORES para localizar el nuevo 'idActual' para devolverlo y usarlo en el insert.

La duda que tengo es si con este método podría haber algún problema si dos usuarios simultaneamente actualizan el mismo registro de CONTADORES y los dos en la select obtuviesen el mismo ID.

Hace años, en Clipper, se usaba un sistema de bloqueo de registro, pero no he visto cómo hacerlo en MySQL.

Muchas gracias
  #2 (permalink)  
Antiguo 27/05/2009, 05:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda sobre ID's

Si, las tres consultas que estas haciendo pueden generar problemas de concurrencia si tienes mas de un usuario al mismo tiempo, puesto que son consultas que para el motor son totalmente independientes, debes definirlas como una unica transacción para que se produzcan los bloqueos necesarios.

Busca en el manual el tratamiento de "TRANSACCIONES" solo podràs usarlo en tablas tipo imnodb.

El sistema de ID que usas, es ingenioso, pero tienes el tipo de datos autoincremental que soluciona todo el proceso que para ti son tres consultas (UPDATE, SELECT y INSERT) con una sola (INSERT), en php, no se si es lo que usas, a demas tines la funcion mysql_insert_id() que te dara el id introducido por el ultimo insert... No veo que justificacion puedes tener para una estructura de este tipo... ten en cuenta que tienes los metadatos de la bbdd que tambien te pueden decir el siguiente id de las tabla con id auto incrementales...

Código sql:
Ver original
  1. SELECT TABLE_NAME, AUTO_INCREMENT
  2. FROM information_schema.TABLES
  3. WHERE table_schema = 'Nombre de bbdd'

esto te da el proximo autoinc de todas las tablas de una bbdd

si agregas esto

Código sql:
Ver original
  1. AND TABLE_NAME = 'Nombre tabla'

sabras el de una tabla concreta. Si le restas 1 tendrás el último. Por lo que tu tabla de contadores no tendria sentido, el propio motor ya crea una...

Quim
  #3 (permalink)  
Antiguo 27/05/2009, 06:17
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Respuesta: Duda sobre ID's

El caso es que desde que estudié, y posteriormente en las empresas en que he trabajado, me han recomendado siempre las personas con más experiencia en bases de datos que evitase el uso de campos autoincrementales en la medida de lo posible, de hecho, el sistema que comento lo usan desde hace mucho tiempo en una empresa grande, pero a mi no me termina de convencer tampoco

Las transacciones y su uso las conozco, pero sólo afectan a actualizaciones en las tablas, pero si tras ella hago un SELECT para obtener el último id (con mi método) no me siento seguro de que devuelva el insertado por cada usuario independientemente de que otro realice una inserción posterior.

Realmente, el tema de bases de datos no es mi fuerte.
  #4 (permalink)  
Antiguo 27/05/2009, 06:22
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: Duda sobre ID's

Cita:
siempre las personas con más experiencia en bases de datos que evitase el uso de campos autoincrementales en la medida de lo posible,
Eso es debido a la normalización de las tablas. En la inmensa mayoría de los casos es innecesario usar autoiincrementales, pero no en todos (la 3FN admite su posibilidad ante la inexistencia de determinantes).
En cuanto a las transacciones, el problema está en el ISOLATION LEVEL, que es lo que tienes que manejar para evitar precisamente lectura de datos "fantasma" en las transacciones concurrentes.
Mira esto:
15.10.3. InnoDB y TRANSACTION ISOLATION LEVEL
__________________
¿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 28/05/2009, 06:19
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Respuesta: Duda sobre ID's

Muchísimas gracias por la info, y también por el enlace, lo explica de forma un tanto enrevesada para mis conocimientos pero seguiré estudiando el tema por ahí (entiendo que con ello sería posible usar mi método sin problema) Gracias
  #6 (permalink)  
Antiguo 28/05/2009, 06:25
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Respuesta: Duda sobre ID's

Bueno creo que he encontrado algo de luz, ejecutando las consultas

SELECT @@global.tx_isolation;
SELECT @@tx_isolation;

... me devuelven 'REPEATABLE-READ' (supongo que se podrá configurar para otro modo), y por lo tanto si según la descripción:

"la consulta ve los cambios realizados exactamente por aquellas transacciones confirmadas antes de ese momento, y no los cambios hechos con posterioridad o por transacciones no confirmadas. La excepción a esto es que la consulta ve los cambios efectuados por la transacción a donde pertenece"

... no tendría problema usando mi método de tabla de CONTADORES, mientras hiciera un UPDATE en dicha tabla y a continuación un SELECT sobre el mismo registro.

Lo que no termino de entender es cuál sería el flujo correcto, pues me parece un poco contradictoria la descripción:

1) BEGIN - UPDATE - COMMIT - SELECT --> "ve los cambios realizados exactamente por aquellas transacciones CONFIRMADAS ANTES de ese momento"
2) BEGIN - UPDATE - SELECT - COMMIT --> La excepción a esto es que la consulta ve los cambios efectuados por la transacción a donde pertenece

Última edición por MikiBroki; 28/05/2009 a las 06:32
  #7 (permalink)  
Antiguo 28/05/2009, 06:56
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: Duda sobre ID's

Cita:
1) BEGIN - UPDATE - COMMIT - SELECT --> "ve los cambios realizados exactamente por aquellas transacciones CONFIRMADAS ANTES de ese momento"
2) BEGIN - UPDATE - SELECT - COMMIT --> La excepción a esto es que la consulta ve los cambios efectuados por la transacción a donde pertenece
En el primer caso, la transaccion está terminada y confirmada, por lo que los datos están fijos en la tabla.
En el segundo caso, el select devuelve los datos actualizados, pero solamente en el entorno en donde está funcionando la transaccion, es decir, solamente en el proceso que está ejecutando la transacción y son invisibles para el resto de los usuarios, porque los datos no están realmente en la base, ya consolidados.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 28/05/2009, 07:00
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Respuesta: Duda sobre ID's

Muchísimas gracias !!! parece justo lo que necesito entonces !
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 14:39.