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)
-   -   Transaction en un procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=53316)

teatry 18-02-2008 17:06:10

Transaction en un procedimiento almacenado
 
Bueno, mi duda es la siguiente:
tengo una base de datos en firebird a la cual le quisiera poner un procedimiento almacenado, que inserte miles de registros a una tabla a partir de los datos de otras tablas, el problema que tengo es que no se como ejecutar la transaccion dentro del procedimiento almacenado después de insertar cada registro a esta tabla, esto lo hice en delphi con un procedimiento, pero el proceso es muy lento.

Existe una sentencia similar a IBTransaction1.CommitRetaining para poner dentro de un procedimiento almacenado.

De antemano muchas gracias...

duilioisola 18-02-2008 20:55:48

En Firebird no existe. Toda la ejecución del procedimiento se ejecuta dentro de una misma transacción.

De todos modos, podrías tratar de que ese procedimiento realizara una parte de las insersiones y devolviera cuantas hizo.

Si hizo más de una, cierras la transaccion, abres una nueva y lo vuelves a lanzar.

Cuando devuelva 0, es que no hizo nada, porque no queda nada más para hacer.

De este modo, las transacciones serán más cortas (hecho deseable) y guardarán menos información para el caso de que fallen y haya que hacer un rollback.

Lo malo es que si falla después de la primera iteración, deberás deshacer los cambios de lo que haya hecho antes manualmente.

teatry 18-02-2008 23:34:03

Muchas gracias por tu respuesta duilioisola
Saludos..

jachguate 18-02-2008 23:55:19

Cita:

Empezado por duilioisola (Mensaje 266758)
De este modo, las transacciones serán más cortas (hecho deseable) y guardarán menos información para el caso de que fallen y haya que hacer un rollback.
Lo malo es que si falla después de la primera iteración, deberás deshacer los cambios de lo que haya hecho antes manualmente.

Es deseable que las transacciones sean cortas... pero, desde mi punto de vista, haciendo esto la transacción como tal perdería sentido.
Si todos los registros forman parte de una transacción... la transacción mas corta será aquella que los inserte todos, sin mas espera.

Así que yo englobaría todo en una única transacción, tarde lo que tarde.

Ahora, si los registros no tienen por que necesariamente pertenecer a una sola transacción, si creo que podrías partir en varios fragmentos una carga muy pesada, lo que beneficiará el tiempo total de ejecución al aliviar la carga de memoria del servidor.

Yo mismo he hecho esto, en ciertos procesos de carga masiva donde, por ejemplo, hago un commit cada 5000, 10000 o 25000 registros.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 09:14:19.

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