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)
-   -   Dudas con transacciones (https://www.clubdelphi.com/foros/showthread.php?t=33373)

Hagen 05-07-2006 03:52:30

Dudas con transacciones
 
Hola.

Uso Delphi 7, Firebird 1.5.3 e IBX 7.08

Ya lei todos los hilos relacionados con transacciones del foro; pero
todavia me quedan algunas dudas:

- Cuando se dice que las transacciones no deben quedar abiertas mucho
tiempo. Esto se refiere a que una vez ejecutado starttransaction se
debe ejecutar inmediatamente un commit o commitretaining???

- Supongamos que tenemos un formulario en donde el usuario debe
introducir una gran cantidad de informacion. Durante ese tiempo
la transaccion debe quedar abierta hasta que el usuario termine
de introducir los datos???

- Cual es momento mas adecuado para iniciar la transaccion.
Al crearse el formulario en donde se llenara informacion???
Al momento de hacer click en algun boton de "insertar" o
"modificar"???

- Cuando se trabajan con transacciones es adecuado utilizar
los controles DataAware (DBEdits, DBComboBox,etc.)???

Muchas gracias de antemano.

Sick boy 05-07-2006 10:22:22

Solo espero que lo que voy a poner sea lo correcto. Al menos es como yo lo hago.

Cita:

Cuando se dice que las transacciones no deben quedar abiertas mucho
tiempo. Esto se refiere a que una vez ejecutado starttransaction se
debe ejecutar inmediatamente un commit o commitretaining???
Piensa en que los usuarios son muy ingeniosos, y que se le pueden ocurrir hacer cosas que tu ni te imaginas. Imagina que un usuario inicia una transacción (editando un registro), le llaman por telefono y se le olvida terminar.
También puede pasar que un registro sea modificado desde varios terminales (casi) al mismo tiempo, por ejemplo, el clasico del stock en los supermercados.

La filosofia no es hacer un commit justo al abrir la transacción, sino en no abrir la transacción hasta que no vayas a hacer un commit.

Es decir, que recojes los datos, y cuando ya los tienes todos y el usuario esta seguro y quiere aceptar, inicias la transacción, grabas los datos y la terminas.

Conseguir esto a veces te obliga a escribir más código, y a utilizar controles no dbaware.

Recomiendo la "cara oculta de delphi 6", aunque creo que la versión de delphi 4 tambien es muy buena.

Cita:

- Supongamos que tenemos un formulario en donde el usuario debe
introducir una gran cantidad de informacion. Durante ese tiempo
la transaccion debe quedar abierta hasta que el usuario termine
de introducir los datos???
Justo a esto es a lo que me refería. Depende de los datos que manejes, pero en general, si va a estar en red, yo intentaría evitarlo.

Cita:

- Cuando se trabajan con transacciones es adecuado utilizar
los controles DataAware (DBEdits, DBComboBox,etc.)???
Depende, yo solo los uso cuando tengo claro que no interferirán en el funcionamiento de la aplicación.

También hay que tener en cuenta los diferentes tipos de transacciones, y buscar el que mejor se ajuste a lo que necesitas. En mi caso, casi todas son "read committed"

Espero que te solucione algo.

Lepe 05-07-2006 14:06:21

Podrías informarte sobre los ClientsDataset con cacheUpdates. Usas controles DBEdits asociados a ese CDS. Puedes Editar, insertar, eliminar registros, etc, pero realmente los datos no se graban a las tablas, sino que se hace en memoria.

Cuando el usuario Pulsa en Grabar, por código llamas a ApplyUpdates del CDS y en ese momento es cuando inicias la transacción, grabas los datos y despues terminas la transacción.

PD: Si me equivoco, por favor corríjanme.

Saludos

Hagen 05-07-2006 15:13:31

Sick boy y Lepe:

Muchas gracias por responder tan rapido.

Me quedan otras dudas.

para Sick boy:
Cita:

Empezado por Sick boy
La filosofia no es hacer un commit justo al abrir la transacción, sino en no abrir la transacción hasta que no vayas a hacer un commit.

Es decir, que recojes los datos, y cuando ya los tienes todos y el usuario esta seguro y quiere aceptar, inicias la transacción, grabas los datos y la terminas.

Te refieres a que cuando se haga click en algun button "Guardar" ó "Grabar" debo
hacer que se llame a STARTTRANSACTION y seguidamente a COMMIT?

Cita:

Empezado por Sick boy
Depende, yo solo los uso cuando tengo claro que no interferirán en el funcionamiento de la aplicación.

Podrias darme algunos ejemplos


Para Lepe
Cita:

Empezado por Lepe
Podrías informarte sobre los ClientsDataset con cacheUpdates. Usas controles DBEdits asociados a ese CDS. Puedes Editar, insertar, eliminar registros, etc, pero realmente los
datos no se graban a las tablas, sino que se hace en memoria.

En este caso no habria problemas cuando se quiere obtener valores(generadores) desde el servidor?

pepon386 05-07-2006 15:29:30

Yo personalmente te recomiendo que utilices lo siguiente:
ConsultaIB -> TDataSetProvider -> TClientDataSet

En "ConsultaIB" utiliza los componentes de acceso a Interbase que prefieras (siempre que deriben de TDataset).

Al usar esta "técnica" lo que consigues es que las actualizaciones se realizan en local, y cuando llamas al método "ApplyUpdates" del TClientDataset, que se encarga de iniciar la transacción, realizar todas las actualizaciones a la base de datos que sean necesarias y a continuación el commit.

Sinceramente, tienes que cambiar un poco la mentalidad de cómo se realizan las actualizaciones, además de que cuando quieres realizar cambios en varias tablas a la vez en una sola transacción debes controlarlo manualmente, pero por lo demás es muy sencillo y eficaz. Documéntate sobre ello. Si mal no recuerdo hay varios ejemplos en bdn.borland.com. Y si tienes algo de dinero para invertir, cómprale a Ian Marteens uno de sus cursos a distancia (son de lo mejor para iniciarse en esto) en http://www.marteens.com

Sick boy 06-07-2006 12:38:12

La solución PROVIDER + CLIENTDATASET parece muy buena, aunque yo aun no la he probado, por eso no puedo opinar.

Como en todo, la solución del PROVIDER tendrá sus ventajas y sus inconvenientes.

Cita:

Te refieres a que cuando se haga click en algun button "Guardar" ó "Grabar" debo
hacer que se llame a STARTTRANSACTION y seguidamente a COMMIT?
Bueno, cuando te contesté estaba pensando en insertar datos sin controles DBAware, asi que no es solo iniciar y terminar la transacción, sino que tienes que poner el SQL en medio.

Por ejemplo, al crear una factura, recoges el codigo del producto y la cantidad mediante un par de edits, y luego al pulsar el boton construyes el SQL que hace la inserción.

Cita:

Podrias darme algunos ejemplos
A mi me gusta que al crear las facturas, el usuario pueda modificar lo minimo posible. Además, al insertar hago más operaciones con los registros (que ya se que se pueden y deben hacer con triggers),asi que me gusta saber en cada momento lo que inserto.

Esto es una opinión, seguro que hay otras formas de hacerlo, y posiblemente más eficientes, pero estaba migrando un programa de PARADOX a FB, y esto es lo que me resultó más facil.

Añadir que yo no utilizo IBX, uso los MDO (Mercury Database Objects), muy buenos, y libres.

Y recomendarte de nuevo la Cara Oculta de Delphi 4, libro gratuito y facil de encontrar. Hay mucha información sobre las transacciones en general.

Y en la cara oculta de delphi 6 hay todo un apartado sobre proveedores y modulos remotos y servidores de capa intermedia.


La franja horaria es GMT +2. Ahora son las 10:34:49.

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