From: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
---|---|
To: | Raul Andres Duque <ra_duque(at)yahoo(dot)com(dot)mx> |
Cc: | Sonia Malave <smalave(at)hidrobolivar(dot)com(dot)ve>, pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Transacciones! |
Date: | 2007-06-26 21:04:02 |
Message-ID: | 20070626210402.GK11609@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2007-06-26 21:08:26 | Re: Fwd: COMPARACION DE DOS TUPLAS |
Previous Message | Juan Carlos Alemán Cuadros | 2007-06-26 20:50:49 | RE: Ide tipo TOAD. |