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)
-   -   DbExpress - Transacciones - más de un clientDataSet (https://www.clubdelphi.com/foros/showthread.php?t=3942)

carlosmari 25-09-2003 16:02:40

DbExpress - Transacciones - más de un clientDataSet
 
Hola foro !!!
Estoy trabajando con D7, PostgreSql y utilizo dbexpress.
Quisiera saber como trabajan uds. cuando tienen varios clientDataSet y desean que todos o ninguno se actualice.
Supongo que para esto se tienen que utilizar las transacciones. Lo que he hecho es lo siguiente:

var TD: TTransactionDesc;
begin
if not SqlConnection1.InTransaction then
begin
TD.TransactionID := 1;
TD.IsolationLevel := xilREADCOMMITTED;
SqlConnection1.StartTransaction(TD);
try
client1.ApplyUpdates(0);
client2.ApplyUpdates(0);
SqlConnection1.Commit(TD);
except
SqlConnection1.Rollback(TD);
end;
end;
end;
Lo he probado y funciona !!! solo un detalle que no entiendo ... si el client1 está ok y el client2 está con error, el 'commit' es el que resuelve todo y no se actualiza ninguno de los 2 client. Es decir que nunca se ejecuta el RooBack pero igualmente no graba nada (ninguno de los 2 client).

Me gustaría que me aconsejen como suelen trabajar uds. cuando tienen que actualizar varios ClientDataSet con una misma transacción.

Gracias anticipada por la ayuda.

Giniromero 25-09-2003 17:08:57

Hola,

¿has probado a usar commitRetaining en vez del commit?

Saludos

Virginia

carlosmari 25-09-2003 17:19:04

No he estado usando el CommitRetaining ya que según entiendo es para cuando se usa con componentes de IB. Yo estoy usando los componentes de dbexpress (SQLConnection, SQLDataSet, DataSetProvider y ClientDataSet).

Gracias por las ideas que puedan darme.

guillotmarc 25-09-2003 18:11:10

Hola

En efecto el CommitRetaining es propio de Interbase/Firebird y solo se puede llamar desde componentes específicos para IB.

Tu código está bien, yo utilizo algo parecido. ¿ Porqué dices que no se ejecuta el RollBack ?. Si el ApplyUpdates del segundo ClientDataset falla, entonces entras en la sección except y se ejecuta el RoolBack.

Saludos.

Julià T. 25-09-2003 19:42:13

El applyUpddates, no genera ningún error, si no que devuelve el numero de errores que se han producido

function applyupdates(...):integer;

por lo que si se quiere controlar en caso de erro se puede poner algo así

if client1.ApplyUpdates(0)+client2.ApplyUpdates(0)=0 then
SqlConnection1.Commit(TD);
else
SqlConnection1.Rollback(TD);

carlosmari 25-09-2003 22:48:08

Marc, aunque no lo creas (yo tampoco lo podía creer) el código que antes escribí nunca entra en el rollback, aunque ocurra un error en uno de los client. Supongo que lo que dice Juliá tiene razón ... eso de que applyupdate no genera un error.

Lo interesante que luego de aplicarse los dos clientDataset (según mi ejemplo) y llegar a la línea donde está el commit no se realiza ningún commit a la base, es decir que de alguna manera detectó el error, pero no salió por el except

Julià T. 25-09-2003 23:54:02

puede que el commit no tenga efecto ninguno si el primer fallo está en el primer cambio que realizas en la base de datos.
El applyupdates(x) se para en el numero x de errores que tú le digas, si le pones 0, se parará en el primer error y el resto de cambios los ignorará, entonces el commit tan sólo realizará los cambios que haya permitido el applyupdates.

carlosmari 29-09-2003 20:07:54

Gracias por la ayuda !!


La franja horaria es GMT +2. Ahora son las 23:54:20.

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