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)
-   -   Transacción y procedimiento almacenado... (https://www.clubdelphi.com/foros/showthread.php?t=49971)

peccatum 05-11-2007 14:09:14

Transacción y procedimiento almacenado...
 
Hola todos...

Mi consulta es la siguiente, yo tengo un procedimiento almacenado que en su ejecución inserta en una tabla y modimica campos en otra.... quiziera que el bloque de instrucciones del stored proc sea "todo o nada" para asegurar consistencia por eso uso una transacción, de la siguiente forma:

Código Delphi [-]
with StoredProc1 do           
 begin           
 Database.DefaultTransaction.StartTransaction;              
   try              
   if prepared = false then   prepare;
             execProc;
             Database.DefaultTransaction.Commit;
             except              showmessage('ups');
             Database.DefaultTransaction.Rollback;
             raise;
    end          
end

Al ejecutar el procedimiento desde Delphi me dá la excepción "transaction active", lo cual será un abrazo mortal...

la duda que tengo es cómo se resuelve ésto, tendré que largar una transacción por cada tabla involucrada desde la aplicación o resolverlo desde la base de datos?

de antemano muchas gracias,

Claudio.-

poliburro 05-11-2007 15:34:53

cuando estás usando procedimientos almacenados, lo mejor es que la transacción la controles en el bloque del procedimiento en cuestion.


Suerte

peccatum 05-11-2007 15:50:31

Hola Poliburro!

ya funciona, al parecer esta mal usar "default transaction" en ese contexto...

lo que hice es crear otra transacción, asignarla a la DB, y ahí hacer los strartransaction, commit y rollback pertinentes...

si alguien opina que debe hacerse de otra forma... bienvenidas las opiniones...

saludos!

Lepe 05-11-2007 15:54:50

Código Delphi [-]
if  Database.DefaultTransaction.InTransaction then
 Database.DefaultTransaction.Commit;
with StoredProc1 do           
 begin           
 Database.DefaultTransaction.StartTransaction;              
   try              
   if prepared = false then   prepare;
             execProc;
             Database.DefaultTransaction.Commit;
             except              showmessage('ups');
             Database.DefaultTransaction.Rollback;
             raise;
    end          
end

No es un abrazo mortal, es que mientras estas en una transacción no puedes empezar otra, tienes que terminar la antigua o cancelarla (Commit / Rollback).

Saludos


La franja horaria es GMT +2. Ahora son las 12:02:56.

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