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

Problema concurrencia

Estas en el tema de Problema concurrencia en el foro de Mysql en Foros del Web. Bueno como creo q en MySQL no hay triggers ni nada parecido (si lo hay avisarme :D) pues tengo el siguiente problema. Todos los identificadores ...
  #1 (permalink)  
Antiguo 10/11/2005, 12:18
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 18 años, 9 meses
Puntos: 0
Problema concurrencia

Bueno como creo q en MySQL no hay triggers ni nada parecido (si lo hay avisarme :D) pues tengo el siguiente problema.

Todos los identificadores de todos los registros de todas las tablas de mi base de datos los obtengo de una tabla "id" q solo tiene un campo con un valor numerico. Cada vez que inserto un nuevo registro en cualquier tabla, tengo q acceder primero a la tabla "id" para obtener el identificador del registro que quiero insertar y aumentar en uno el valor guardado en la tabla "id" para que ese identificador no se vuelva a repetir en otro registro.

Esto lo hago y va bien a priori, pero no m parece muy seguro hacer esto así. ¿Como me puedo asegurar que no se accede dos veces a la vez a la tabla "id" y obtienen el mismo identificador?¿Eso puede pasar no?¿Como lo puedo resolver?¿Hay otra forma más segura de hacer esto?

Tambien puede ocurrir q por lo q sea obtenga el identificador, ocurra un error y no se incremente la tabla id y q posteriormente se devuelva el mismo identificador para otro registro. ¿Hay alguna manera en MyQSL de hacer todo esto como una unica operacion?

Un Saludo.
  #2 (permalink)  
Antiguo 10/11/2005, 16:37
 
Fecha de Ingreso: noviembre-2005
Mensajes: 658
Antigüedad: 18 años, 5 meses
Puntos: 3
Tienes que trabajar con transacciones.

Debes hacer algo parecido a esto

begin tran
select ...
update tabla1 ...
if @@error > 0 begin
rollback tran
return
end
insert ....
if @@error > 0 begin
rollback tran
return
end
else
commit tran
  #3 (permalink)  
Antiguo 11/11/2005, 02:18
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
En Mysql 5.0 ya están transacciones y "todo eso" como dices tú.

Te recomiendo utilizar Ids autonúmericos para evitar toda esa problematica.
  #4 (permalink)  
Antiguo 11/11/2005, 02:54
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 18 años, 9 meses
Puntos: 0
Gracias a los dos, voy a mirar esto de las transacciones.

Los Ids autonuméricos no me valen, xq no quieren que se repita ningún id en ninguna tabla
  #5 (permalink)  
Antiguo 11/11/2005, 03:07
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Pues en tu tabla de ids el id lo haces autonumérico, que problema hay en eso???
  #6 (permalink)  
Antiguo 11/11/2005, 03:51
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 18 años, 9 meses
Puntos: 0
Cita:
Iniciado por Jose_minglein2
Pues en tu tabla de ids el id lo haces autonumérico, que problema hay en eso???
No se, pero y si se accede a la vez a la tabla id desde dos sitios distintos??podrían leer el mismo id, no lo se
  #7 (permalink)  
Antiguo 11/11/2005, 05:41
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
pero no se trata de eso, vamos a ver. Tu debes seguir los siguientes pasos:

- Insertar Id/leer id (select @@identity;)
- Con eso obtienes el id insertado, no existe concurrencia, quien inserta lee asi de sencillo. Pues con ese id insertas en la tabla que quieras.

Asi de sencillo.
  #8 (permalink)  
Antiguo 14/11/2005, 13:50
 
Fecha de Ingreso: julio-2005
Ubicación: España
Mensajes: 91
Antigüedad: 18 años, 9 meses
Puntos: 0
La cosa es q yo lo necesito hacer en PHP y creo q lo q m hablas es ASP por lo q he buscado por ahi
  #9 (permalink)  
Antiguo 15/11/2005, 00:15
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
select @@identity;
Es SQL no PHP te vale para PHP, ASP y lo que quieras, es carateristico de MySQL
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 12:13.