Re: Transacciones!

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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.