PDA

Ver la Versión Completa : Como actualizar mi contador numerico en dos o mas aplicaciones?


IcebergDelphi
14-06-2003, 05:31:32
Hola amigos del foro, antes que nada quiero agradecer a aquellos que brindan ayuda desinteresada a cada
uno de los del foro y gracias por ayudarme.
Mi problema es el siguiente:
Estoy haciendo un sistema con Firebird , dentro de la base hay tres tablas,
Una es la tabla Maestra (Grupos)y la otra la tabla detalle(DetalleGrupos), y por separado tengo una tabla llamada Contador
que es la que lleva el control del numero de IdGrupos de la tabla maestra (grupos), de igual forma
dentro de mi protecto utilizo un modulo en donde residen estas tre tablas con (TIbTable).
En el evento On NewRecord de la tabla Grupos utilizo este codigo para generar el conteo numerico de la tabla contador:
begin
With TCntGrupo Do // Tabla Contador
Begin
Open;
Try
Edit;
//Tablagrupo TablaContador
TGruposIdGrupo.Value:=TCntGrupoCntIdGrupo.Value;
//TablaContador Tablacontador
TCntGrupoCntIdGrupo.Value:=TCntGrupoCntIdGrupo.Value + 1;
Post;
Finally
Close;
end;
end;
end;

Funciona bien el contador si abro solamente una vez la aplicacion pero si se abre en dos maquinas...
El problema es en si, que si habro dos veces la aplicacion o lo pruebo en dos maquinas al mismo tiempo
el contador de la segunda aplicacion atrapa el numero de la Primera aplicacion, es decir: no se actualiza y
los dos se quedan con el mismo numero correspondiente, lo que me gustaria es que cada uno actuara como una aplicacion independiente
si doy click en agregar de la primera aplicacion el contador genere el numero P/e:32 entonces di doy clic en agregar de la segunda aplicacion
me gustaria que el contador generara p/e: 33, y esto no pasa los dos generan el mismo numero y me trae problemas de Indices con
mi tabla Grupo.
Ya use transacion con mi tabla Grupo y nada, ya probre con triggers pero este tarda para generar el autonumerico y meda mas problema.
Alguien tiene una posible solucion, se los agradeceria.

Gracias.

kinobi
14-06-2003, 10:41:16
Hola,

Posteado originalmente por IcebergDelphi
Funciona bien el contador si abro solamente una vez la aplicacion pero si se abre en dos maquinas...
El problema es en si, que si habro dos veces la aplicacion o lo pruebo en dos maquinas al mismo tiempo
el contador de la segunda aplicacion atrapa el numero de la Primera aplicacion, es decir: no se actualiza y
los dos se quedan con el mismo numero correspondiente, ...

en realidad la segunda aplicación (transacción) no "atrapa el numero de la Primera aplicacion", sino que debido al aislamiento entre ambas transacciones (la de la primera y segunda aplicación), las dos ven el mismo valor para el contador, a pesar de que la primera haya modificado su valor.

Una regla a tener en cuenta: dos transacciones concurrentes tendrán la misma visión de los datos (la que tenían cuando se abrieron), a pesar de que una de ellas los modifique, mientras no se confirmen los cambios y desde la segunda se tenga un nivel de aislamiento lo suficientemente bajo (p. ej. READ COMMITTED) para poder ver estos cambios confirmados (commit).

Algunas alternativas:

1. Abrir una transacción independiente para leer y actualizar el valor del contador; mejor a tavés de un procedimiento almacenado, para que el servidor haga el trabajo, cerrando la transacción lo más rápido posible. Como podrían aparecer errores de actulización (que dos transacciones intenten modificar a la vez el contador), habría que controlar en el cliente que de producirse el mismo, se volviese a ejecutar el proceso que obtiene un nuevo valor del contador.

2. Si el valor del contador es un entero, utilizar un mecanismo que no dependa de las transacciones ... los generadores. A tener en cuenta que los generadores, al estar fuera del control transaccional, no le afecta la cancelación de los cambios aplicados (rollback), con lo que pueden aparecer huecos en la secuencia.

Podemos desarrollar más en detalle estas u otras alternativas.

Saludos.

IcebergDelphi
16-06-2003, 05:46:11
Gracias amigo por tu interes, dejame contarte que recurri a otro metodo, lo que hice fue meter IbDatasets para la el maestro y para el detalle, y en el maestro Me fui al generatorfield y llame al generador que habia hecho en mi base y eureka funciono todo a la perfeccion, claro tambien meti dos Ibtransactios para cada una de las tablas, por ultimo elimine el codigo de mi problema y claro latabla contador .

Gracias por la respuesta y seguiremos en contacto.