From: | jlcambero <jlcambero(at)emergya(dot)es> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Transacciones! |
Date: | 2007-06-27 09:24:27 |
Message-ID: | 200706271124.27152.jlcambero@emergya.es |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El Martes, 26 de Junio de 2007 23:04, Alvaro Herrera escribió:
> Raul Andres Duque escribió:
> > Una pregunta relacionada:
> >
> > Ya que una función no puede manejar transaciones explicitas (cada SP se
> > considera una transacción en sí), si tengo SPs anidados (un SP llama a
> > otros), cómo se maneja el tema de transacciones, si no es posible usar
> > transacciones anidadas??
>
> Todas las funciones se ejecutan dentro de la misma transaccion. Eso de
> que "cada SP se considera una transaccion en si" es un invento; o mas
> bien una simplificacion de la realidad.
>
> La realidad es que las funciones no abren ni cierran transacciones. La
> transaccion se abre _antes_ de que la funcion se invoque, si es que no
> hay una abierta de antemano. Y si habia una transaccion abierta,
> entonces al terminar la funcion, no se hace nada. Y si no la habia,
> entonces la transaccion se cierra.
>
> Para mayor confusion, hay que agregar que esto en realidad no tiene nada
> que ver con las funciones, sino que TODAS las ordenes funcionan de la
> misma manera. Si tu envias un "SELECT * from table" sin una
> transaccion, entonces se abrira una antes de ejecutar el SELECT, y se
> cerrara despues que termine. A menos que ya haya una abierta, en cuyo
> caso no se hace nada.
>
> Entonces la regla en realidad es "toda orden que se envie al motor se
> ejecuta dentro de una transaccion". Ya sea porque el usuario la abrio
> manualmente con BEGIN o START, o bien porque el motor la abrio
> automaticamente al ver que no habia una.
>
> > Lo ideal sería que se generara una transacción SOLO por la función más
> > "externa" y si alguien quiere puede utilizar SAVEPOINTs antes de los
> > llamados a los SP "internos" ... así lo maneja postgresql?
>
> No. Casi. Se abre una transaccion para la orden mas externa (que
> puede ser una funcion o puede ser otra cosa), y no se hace nada para las
> mas internas.
mmm a ver si lo he entendido yo!
BEGIN
llamada_funcion();
r = llamada_funcion2();
IF (!r)
ROLLBACK;
Si quiero hacer un rollback de "llamada_funcion()" al fallar llamada_funcion2
() se podria hacer así?
Gracias, un saludo
From | Date | Subject | |
---|---|---|---|
Next Message | Mario Gonzalez | 2007-06-27 12:33:05 | Re: problema instalacion postgresql 8.1 en windows vista |
Previous Message | jlcambero | 2007-06-27 09:03:17 | Re: Ide tipo TOAD. |