[Lazarus-es] zeos-firebird: ejemplo transacciones

Paola Bruccoleri pbruccoleri en adinet.com.uy
Jue Mayo 13 02:34:44 CEST 2010


José Antonio Cuello escribió:
> Hola, yo trabajo siempre las transacciones manualmente. Simplemente
> usando la funcion InTransaction de la base de datos o del conection (no
> recuerdo ahora donde está) controlas si tienes que hacer el
> starttransaction, y con try finally o except controlas los rollbacks.
> Sería algo así:
>
> var vTrans: Boolean;
> begin
>   vTrans := database.Intransaction;
>   try
>     if (not vTrans) then database.starttransaction;
>     ...
>       [sentencias de Insert/Update/Delete]
>     ...
>     if (not vTrans) then database.commit;
>   finally
>     if (not vTrans) and database.Intransaction then database.rollback;
>   end;
> end;
>
>   
Hola José..
seguí tu esquema para agrupar las sentencias sql en una misma 
transacción, y hoy estuve haciendo pruebas y no me está funcionando. No 
se si  soy yo o un problema del zeos.
(zeos7.0.0, firebird 2.1.3).

   vTrans := DBMain.fdb.Intransaction;
   try
      if (not vTrans) then DBMain.fdb.StartTransaction;
      Graba;
      if (not vTrans) then DBMain.fdb.Commit;
   finally
      if (not vTrans) and DBMain.fdb.Intransaction then DBMain.fdb.Rollback;
      MessageDlg('Error', 'Hay error en los datos', mtWarning, [mbOk], 0);
   end;


Graba() hace esto:
DBMain.fdb.AutoCommit:= false; 
ejecuta un store procedure
ejecuta varios inserts en tabla A
ejecuta un delete en tabla B

A propósito mando datos erróneos en el delete, violando la integridad 
referencial o poniendo mal un nombre de parámetro y al chequear la bd, 
veo que se ejecutó y "commiteo" la store procedure y los inserts...
Por tanto, no me quedan las 3 sentencias agrupadas en la MISMA transacción.

qué estará pasando?
muchas gracias a todos..
chauuuuuuuuuu







More information about the Lazarus-es mailing list