Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Totalizar sobre una base en actualizacion (https://www.clubdelphi.com/foros/showthread.php?t=49923)

skaiser 03-11-2007 16:51:32

Totalizar sobre una base en actualizacion
 
Estimados Foristas:
El problema que se me presenta es tener que calcular totales sobre tablas con un gran número de registros mientras estos se encuentran en actualización.
Para tratar de aclarar un poco, el problema puede pensarse como que tengo un par de tablas en relacion maestro/detalle con un gran numero de registros y sobre estas debo, primero, realizar cálculos en la tabla maestra y totales sobre la tabla de detalle y presentarlos en una nueva relación maestro/detalle. Si bien la actualización se realiza en un ambiente transaccional, los tiempos involucrados hacen que los resultados de las consultas sean inconsistentes, es decir que la informacion dada en la tabla maestra no se corresponde con lo totalizado en la tabla detalle. Si alguien conoce algun método o técnica para realizar estas presentación, le agradeceria cualquier sugerencia. Muchas gracias.

Lepe 03-11-2007 17:48:44

Kinobi hizo en su momento un pdf llamado "transacciones en Interbase y Firebird, ignoro si está en este foro, aunque en www.firebird.com.mx lo puedes encontrar. Te recomiendo su detenida lectura.

Allí se habla del nivel de aislamiento de una transacción (isolation level), creo que en lugar de usar read commited (que será la que usas actualmente) deberías usar snapshot. Esto se indica en los parámetros del objeto Transaction que uses, dicho de otra forma, en la propiedad Transaction.Params

Cita:

SNAPSHOT: conocido también por lectura repetible (repeteable read). Ofrece
un nivel de aislamiento alto, de tal forma que la transacción no puede
ver los cambios provocados por otras transacciones; es decir, mantiene una
foto fija del estado de la base de datos en el momento que se inició la transacción
A groso modo:
- Empezamos una transacción nueva
- hacemos operaciones con la maestra
- operaciones con la detalle
- buscamos los totales de la detalle (como nuestra transacción en snapshot no puede ver las actualizaciones realizadas por otras transacciones, solo verá los cambios realizados antes de que empezó nuestra transacción).
- mostramos todo en pantalla
- cerramos transacción (commit).

Saludos

tefots 04-11-2007 14:39:54

yo creo que el problema es que aunque usando la transaccion en modo snapshot , como los calculos tardan en hacerse (por la cntidad de registros) , siempre habrá alguien que modifique algun registro en el detalle , con lo que los calculos quedarian inconsistentes , ya que lo calculado no corresponderia con lo que realmente hay en el detalle al hacer el commit.

la unica manera que veo es meter triggers y proc almacenados y que estos sean los que hagan los calculos y actualicen los totales. y aun así tampoco estoy seguro que funcione correctamente.

saludos


La franja horaria es GMT +2. Ahora son las 13:39:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi