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)
-   -   FB+IBX+IBTransaction+ClientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=57495)

hibero 17-06-2008 18:35:09

FB+IBX+IBTransaction+ClientDataSet
 
Utilizo IBX+ClientDataSet para acceder a FB 2 .

Utilizo un componente IBDataBase un componente IBTransaction
y el esquema de conexion de a cada Tabla viene siendo el que sigue

IBQuery<---DataSetProvider<---ClientDataSet<---DataSource<---DBGrid

si hago un cambio en el DBGrid se dispara el evento AfterPost, AfterDelete en el cual hago un

ClienteDataSet.ApplyUpdates(-1);

Todo funciona perfecto. El problema es si abro el programa en otro ordenador accediendo de forma concurrente sobre la misma tabla y base de datos. El segundo Ordenador no se entera de los cambios que ha hecho el primero a no ser que haga un commit. Es decir

Si A los eventos AfterPost y afterDelete les pongo el codigo

ClientDataSet.ApplyUpdates(-1);
if IBQuery.Transaction.InTransaction then IBQuery.Transaction.commit;

Es esto normal. O estoy haciendo algo mal

Al González 17-06-2008 19:54:03

¡Hola!

Un compañero acaba de tener una duda similar. Creo que si echas un vistazo a lo que comento en este hilo se despejarán algunas de tus dudas:

http://www.clubdelphi.com/foros/showthread.php?t=57459

También considera que la naturaleza de una transacción es precisamente "aislar" un grupo de operaciones de tal manera que sólo la aplicación que las ha ejecutado puede verlas hasta que ésta las da por confirmadas. La transacción asegura que se realicen todas las operaciones sin problema alguno o bien que no se confirme ninguna de ellas, pero que no quede en la base de datos la información "a medias".

La anterior es una de las varias razones por las cuales la gente prefiere el uso de bases de datos cliente-servidor en lugar de las antiguas y frágiles bases de datos de escritorio (Access, Paradox, dBase, Fox, etc.).

Cabe mencionar que la transacción se inicia con cierto "nivel de aislamiento", y dependiendo de este nivel es que una conexión podrá ver o no los cambios aún no cometidos (confirmados) por otra conexión.

Tradicionalmente se emplea el nivel de aislamiento "Read Committed", el cual no permite consultar información que todavía no haya sido cometida por otras transacciones.

Espero haber ayudado a orientarte. No dejes de retroalimentar el hilo con tus inquietudes al respecto.

Un abrazo.

Al González. :)

hibero 17-06-2008 20:30:27

he mirado en el hilo que me comentas, ya lo habia estado leyendo, pero al tratarse de distintos componentes (creo en ese hilo se utiliza FIB) decidí abrir este segundo hilo.
En mi caso símplemente es que tenia entendido que el DataSetProvider se encargada de iniciar (startTransaction) y finalizar (Commit o rollback) las transacciones.

Al González 17-06-2008 20:52:18

Cita:

Empezado por hibero (Mensaje 294153)
...tenia entendido que el DataSetProvider se encargada de iniciar (startTransaction) y finalizar (Commit o rollback) las transacciones.

Doy la misma respuesta. ;)
http://www.clubdelphi.com/foros/show...48&postcount=6

Rockin 18-06-2008 08:26:28

Tengo el mismo problema como indica AI Gonzalez, he hehcho de todo pero nada. Si alguien encuentra la solución que la postee.

Gracias y saludos.

hibero 18-06-2008 08:29:14

el caso es que tengo un tibtransaction y un tibdatabase desde que conecto a la base de datos (tibdatabase.open) si el componente tibtransaction inicia una transaccion (Por lo tanto me veo obligado a realizar un commit tras realizar un applyupdates en el client dataset).
en vista de esto he asociado un componente transaccion para el componente ibquery es decir (diferente del que tiene asociado el componente tibdatabase)
TIbtransaction<--TIBQuery<--TDataSetProvider<--TClientDataSet<--TDataSource<---TDBGrid

En este caso si yo no hago en mi codigo un tibtransaction.Starttransaction no se debería haber iniciado una transacción y entiendo que el TDataSetprovider deberia manejar las transacciones por mi. Pero sigo teniendo el mismo problema (Problema que en realidad se soluciona si siempre que hago un applyupodate a continuacion hago una commit de la transaccion asociada)

hibero 18-06-2008 12:00:58

Lo he solucionado haciendo un commit tras cada Applyupdates pero no se si es lo correcto, el caso es que funciona

Rockin 18-06-2008 12:01:38

¿Donde haces el commit en el Servidor de Capa Intermedia o en la Aplicación Cliente?

saludos.

Rockin 18-06-2008 12:50:37

Ya he conseguido realizar los cambios en la BD pero solo se realizan cuando cierro la Aplicacion. ¿Que tengo que hacer para se realicen en el momento?

hibero 18-06-2008 17:32:17

Rockin en vez de cerrar haz un commit y seguramente se te grabaran los datos (po al menos eso es lo que me pasa a mi).
En mi caso estoy haciendo pruebas asi que tengo todo en un modulo de datos. Pero supongo que lo haras donde tengas el componente transaccion o no

Cañones 19-06-2008 16:02:46

Hola a todos.
Para este tema Yo deje un ejemplo de como lo solucione.
http://www.clubdelphi.com/foros/show...5&goto=newpost

No se si es lo mejor, pero me funciona.

Saludos. Espero que sirva de algo.

Gabriel 19-06-2008 17:24:47

con DBX
 
Siempre me a ido perfecto, desde la versión 1 de Firebird hasta la 2.1 que utilizo ahora
al Aceptar y hacer el Post i el Apply, cualquier cliente ya ve los datos gravados, en el acto.


SQLQuery - DatasetProvider - ClientDataset

try
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
except
ClientDataSet1.Cancel;
ClientDataSet1.CancelUpdates;
end;

en el TSQLConnection (solo uno por aplicación)

procedure TFModuloIni.SQLConnection1BeforeConnect(Sender: TObject);
begin
SQLConnection1.ConnectionName := 'MiConexion';
SQLConnection1.DriverName :='Interbase';
SQLConnection1.Params.Values['BlobSize'] := '-1';
SQLConnection1.Params.Values['CommitRetain'] := 'False';
SQLConnection1.Params.Values['Database'] := Utilidades.DataBaseUtil;
SQLConnection1.Params.Values['ErrorResourceFile'] := '';
SQLConnection1.Params.Values['LocaleCode'] := '0000';
SQLConnection1.Params.Values['Password'] := 'masterkey';
SQLConnection1.Params.Values['RoleName'] := 'RoleName';
SQLConnection1.Params.Values['ServerCharSet'] := '';
SQLConnection1.Params.Values['SQLDialect'] := '1';
SQLConnection1.Params.Values['Interbase TransIsolation'] := 'ReadCommited';
SQLConnection1.Params.Values['User_Name'] := 'sysdba';
SQLConnection1.Params.Values['WaitOnLocks'] := 'True';
end;


Salut

Al González 19-06-2008 17:42:18

Cita:

Empezado por Rockin (Mensaje 294227)
Tengo el mismo problema como indica AI Gonzalez...

¿Y ese quién es? :confused:


La franja horaria es GMT +2. Ahora son las 07:43:17.

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