Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Las transacciones y yo (https://www.clubdelphi.com/foros/showthread.php?t=6014)

gario 15-12-2003 14:15:48

Las transacciones y yo
 
Hola a todo el mundo:

No tengo muy claro como implementar una transaccion, os cuento mi problema. Tendo dos tablas una de citas y una de clientes necesito que en deteminado momento se actualice un registro de la tabla citas y el asociado de la tabla clientes. Evidentemente todo seguido para mantener la informacion coherente.

Me gustaria saber como implementar eso en delphi mediante los componente de IBX, lo que no tengo muy claro es como usar el el componente ibtransaction como asociarlo a las acciones que realizo como conseguir que no me de problemas con otras transacciones (me da errores de que estan otras abiertas o algo asi)

Creo que se puede definir la transaccion en la propia base de datos pero tampoco tengo muy claro como implementar... los conceptos los se y la teoria... pero me vendria de perlas un ejemplo en codigo puro y duro

Gracias de antemano!!

Voutarks 16-12-2003 14:40:21

En primer lugar y aunque dices que sabes la teoría, ¿te has leido el magnífico manual sobre las transacciones de nuestro amigo kinobi? Es un .pdf que pueden encontrar en este enlace (pinchar aqui)

Sabrás que las transacciones se manejan desde IBX con el componente IbTransaction. No hay que saber demasiado, solo un par de cosas.

Todos los componentes de acceso a datos (query's, sql's, etc) tendrás que asociarlos a una o varias transacciones, las cuales irán asociadas a una o varias bases de datos. Las transacciones, desde un punto de vista lógico, yo las veo como agrupaciones de instrucciones en bloque, asi qee en un programa concreto según como sea y cómo va a funcionar se ve, más o menos, como debe ser esta distribución, si a tal transacción se le asocia este y/o este otro conponente de datos, etc. Como regla general mía te puedo decir que el número de transacciones que hay en la aplicación suele coincidir con el número de operaciones concurrentes de datos que se pueden llegar a relizar en la aplicación, así que en general cualquier aplicación tendrá como mínimo dos, una de lectura y otra de escritura-modificación-borrado.

Pudes dejar que las transacciones se abran solas (es la opción por defecto) o que se cierren solas (no es la opción por defecto y no es nada recomendable, opino yo). Yo personalmente abro explícitamente todas las transacciones, asi que pongo la propiedad AllowAutoStart de la transaccion a false, pero si se deja que se abran solas tampoco supone practicamente ningun riesgo.

Tambien debes saber cuando tienes que confirmar o rechazar los cambios: para confirmar está el método commit y para rechazar el rollback, ambos métodos cierran la transacción, es decir, la terminan. También están el commitretaining y rollbackretaining, que confirman o rechazan pero manteniendo el "contexto" de la transacción, es decir que la transacción sique abierta y los recursos del servidor siguen ocupados por ella. A mi personalmente no me gusta este enfoque y no procuro no hacer nunca ..retaining.

Con eso para empezar está bien. Te recomiendo leer el manual de kinobi una vez más.

gario 16-12-2003 18:22:17

Lo primero agradecerte la respuesta....

He oido hablar mucho muchisimo de ese manual y me he leido muchos post de Kinobi en estos dos dias... pero no se por que gracia no puedo acceder a terra con lo que no puedo bajarme ese manual... esperare a poder entrar desde algun sitio para leeme el documento porqeu estoy muy torpe y no soy capaz de explicarme bien y cada dia me lio mas.

Muchas gracias de nuevo.

Lepe 17-12-2003 10:17:03

Gario, he bajado el archivo sin problemas, lo tienes en tu correo hotmail

SAludos

gario 18-12-2003 13:41:25

Muchas gracias Lepe. Procedo a estudiarmelo.

peccatum 16-03-2009 17:23:13

hola

yo lo que tengo que resolver es algo parecido a lo del amigo, estoy con componentes MDO....

Cual sería la forma más apropiada para configurar los componentes? ya que tengo dos datasets (Típico Documentos - Detalle_Documentos), y claro, tengo una función llamada Cargar_lineas_documento la cual hace varios posteos a la DB, y si en algún punto falla necesito que no se cargue nadita nada de nada. Es lo que no estoy logrando ='(

Teniendo en cuenta el enfoque de una transacción global para escritura, esta debería ser usada por todos los Datasets pertenecientes a una misma DB?

Pongámosle TR_ESCRITURA, a esta transacción, y teniendo la propiedad transaction de los datasets apuntando a esa transacción debería funcionar de la siguiente forma?

Código Delphi [-]
try
               TR_ESCRITURA.StartTransaction;
                Enc_Documentos.Post();
                Cargar_lineas_Documentos (ID_DOCUMENTO);
                TR_ESCRITURA.Commit;
            except
               TR_ESCRITURA.Rollback;
               raise;
            end;

lo he encarado de esta forma y no me viene funcionando.... :S O hay que hacer un begin transaction por cada dataset?

Saludos


La franja horaria es GMT +2. Ahora son las 15:25:00.

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