From: | Romulo <rubenvive(at)gmail(dot)com> |
---|---|
To: | Romulo <rubenvive(at)gmail(dot)com>, Ayuda Postgres <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Sobre Transacciones |
Date: | 2005-12-18 14:04:53 |
Message-ID: | dbb3157b0512180604y2a9125efj8a74ee99f5fe188e@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Gracias por responder Alvaro.
Entonces, puedo concluir que:
Desde una aplicación cliente invoco a un procedimiento almacenado,
independientemente de cuántas acciones diferentes ejecuto dentro del
procedimiento (varios insert, otros cuantos updates, e incluso si invoco a
otros procedimientos almacenadas desde ahí), si uno de ellos falla, -en el
peor de los casos el último- todos los cambios efectuados por las primeras
sentencias que tuvieron éxito dentro del procedimiento serán revertidas?,
dejando así la base de datos en su estado original ?
Agradeceré me puedas refrendar (o corregir) el punto anterior.
Gracias de antemano.
On 12/18/05, Alvaro Herrera <alvherre(at)commandprompt(dot)com> wrote:
>
> Romulo escribió:
>
> > Si desde una aplicación cliente usando un NetProvider, por ejemplo,
> invoco
> > un procedimiento almacenado, con varias sentencias en su interior, y si
> la
> > última de ellas genera un error, las que primero se ejecutaron sin
> problema
> > quedan definitivamente en la base de datos?, o todo el procedimiento
> > almacenado es revertido, porque a fin de cuentas desde la aplicación
> cliente
> > es un solo comando?
>
> Postgres ejecuta todo dentro de una transaccion, ya sea que se lo
> indiques explicitamente usando BEGIN/COMMIT, o bien inicia
> implicitamente una transaccion al momento de ejecutar un comando. (Si
> se termina de inmediato al terminar el comando, o continua hasta
> encontrar un COMMIT/ROLLBACK, depende de si el cliente esta usando
> autocommit. El comportamiento por omision es hacer el COMMIT
> inmediatamente despues de terminada la ejecucion del comando).
>
> Por lo tanto, el procedimiento completo se ejecuta dentro de una y solo
> una transaccion. Si cualquier parte de el falla, la transaccion
> completa es abortada.
>
> > O es que debo, dentro del procedimiento colocar explícitamente un
> > bloque de control transaccional con el begin, commit o rollback?
>
> De hecho si lo trataras, verias que no te lo permite. En PL/pgSQL
> puedes usar bloques de excepcion para establecer savepoints, pero si das
> un COMMIT te va a lanzar un error.
>
> --
> Alvaro Herrera
> http://www.CommandPrompt.com/
> PostgreSQL Replication, Consulting, Custom Development, 24x7 support
>
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2005-12-18 15:02:21 | Re: Sobre Transacciones |
Previous Message | Alvaro Herrera | 2005-12-18 13:00:31 | Re: Sobre Transacciones |