Re: [GENERAL] Transacciones Anidadas

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Juan Garcés Bustamante <jgarces(at)futuroprofesional(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [GENERAL] Transacciones Anidadas
Date: 2005-12-16 21:42:02
Message-ID: 20051216214202.GG27602@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda pgsql-general

Hola, incluyo una copia a la lista de tu mensaje. Por favor haz lo
mismo siempre. Te sugiero que te suscribas a la lista (puedes usar el
modo "nomail" para que no te llegue ningun mensaje de ella si asi lo
deseas).

Mi respuesta mas abajo:

Juan Garcés Bustamante escribió:
> Hola
>
> Bueno, ya sabía de los savepoints, pero el problema es que la segunda consulta
> la tengo en un función, te explico con un ejemplo:
>
> function mi_funcion_1() {
> ...sql_query("BEGIN WORK");
> ...sql_query("INSERT INTO mitabla VALUES (1)");
>
> ....mi_funcion_2(); /*aquí ejecuto las otras instrucciones sql*/
>
> ...sql_query("INSERT INTO mitabla VALUES (4)");
> ...sql_query("ROLLBACK WORK");
> }
>
> function mi_funcion_2() {
> ...sql_query("BEGIN TRANSACTION");
> ...sql_query("INSERT INTO mitabla VALUES (2)");
> ...sql_query("INSERT INTO mitabla VALUES (3)");
> ...sql_query("COMMIT TRANSACTION");
> }
>
> Mi problema es que mi_funcion_2 puede ser llamada en forma independiente a
> mi_funcion_1, con lo que el uso de savepoints no me serviría de mucho, pues no
> pueden ser usados si no están en una transacción.

Esto no funcionara jamas lamentablemente. Lo que puedes hacer es usar
una bandera para decirle a la funcion 2 si se esta ejecutando dentro de
una transaccion o no, y que use un savepoint o una transaccion
dependiendo de esto:

function mi_funcion_2(bool en_transaccion) {

if (en_transaccion)
sql_query("savepoint foo");
else
sql_query("BEGIN TRANSACTION");

...sql_query("INSERT INTO mitabla VALUES (2)");
...sql_query("INSERT INTO mitabla VALUES (3)");

if (en_transaccion)
sql_query("release foo");
else
sql_query("commit TRANSACTION");
}

--
Alvaro Herrera Developer, http://www.PostgreSQL.org
La web junta la gente porque no importa que clase de mutante sexual seas,
tienes millones de posibles parejas. Pon "buscar gente que tengan sexo con
ciervos incendiándose", y el computador dirá "especifique el tipo de ciervo"
(Jason Alexander)

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Felipe Araoz Ramos 2005-12-16 21:54:24 Fwd: Pasar parametros a PostgreSQL
Previous Message Guillermo Schulman 2005-12-16 21:25:02 upgrade a PG 8.1

Browse pgsql-general by date

  From Date Subject
Next Message Jerry Sievers 2005-12-16 21:42:37
Previous Message Chris Browne 2005-12-16 21:26:48 Re: Toolkit for creating editable grid