Transacciones Anidadas
Hola
Estoy trabajando con Postgres 8.0.3 en Ubuntu.
Necesito realizar transacciones anidadas, pero no logro que se aborten
transacciones intermedias al abortarse una superior.
Ejemplo:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;
El "ROLLBACK WORK" no aborta la TRANSACTION.
Resultado de la consulta:
mitabla
========
1
2
3
(3 rows)
Resultado esperado:
mitabla
========
(0 rows)
Alguna idea??
Gracias.
On 12/16/05, Juan Garcés Bustamante <jgarces@futuroprofesional.cl> wrote:
Hola
Estoy trabajando con Postgres 8.0.3 en Ubuntu.
Hola, escribiste a una lista en ingles, te rediriji a la lista en
español pgsql-es-ayuda@postgresql.org
Necesito realizar transacciones anidadas, pero no logro que se aborten
transacciones intermedias al abortarse una superior.Ejemplo:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;El "ROLLBACK WORK" no aborta la TRANSACTION.
Resultado de la consulta:
mitabla
========
1
2
3
(3 rows)Resultado esperado:
mitabla
========(0 rows)
Alguna idea??
Gracias.
en verdad ocurrio eso?
lo voy a probar mas tarde... aunque en postgres no existen las
transacciones anidadas, se llaman savepoints y la sintaxis es distinta
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
SAVEPOINT foo;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
RELEASE foo;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
On Fri, Dec 16, 2005 at 03:23:07PM -0400, Juan Garcs Bustamante wrote:
Estoy trabajando con Postgres 8.0.3 en Ubuntu.
Jaime Casanova has already mentioned this list is in English and
that questions in Spanish should go to pgsql-es-ayuda.
Necesito realizar transacciones anidadas, pero no logro que se aborten
transacciones intermedias al abortarse una superior.
PostgreSQL 8.0 and later have savepoints; they don't support nesting
transactions by using multiple BEGIN statements.
http://www.postgresql.org/docs/8.0/interactive/tutorial-transactions.html
http://www.postgresql.org/docs/8.0/interactive/sql-savepoint.html
Ejemplo:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;El "ROLLBACK WORK" no aborta la TRANSACTION.
It does abort a transaction, but not the one you're thinking of.
The second BEGIN has no effect because you're already in a transaction:
test=> BEGIN WORK;
BEGIN
test=> INSERT INTO mitabla VALUES (1);
INSERT 0 1
test=> BEGIN TRANSACTION;
WARNING: there is already a transaction in progress
BEGIN
test=> INSERT INTO mitabla VALUES (2);
INSERT 0 1
test=> INSERT INTO mitabla VALUES (3);
INSERT 0 1
test=> COMMIT TRANSACTION;
COMMIT
You've committed the transaction, so the three inserted records are
in the table, as your query shows:
Resultado de la consulta:
mitabla
========
1
2
3
(3 rows)
You didn't explicitly begin another transaction but the fourth
insert does appear to have been rolled back, so I'd guess you're
using a client that has autocommit disabled. After you committed
the first three inserts another transaction was started automatically,
and that's what was rolled back.
--
Michael Fuhr
Jaime Casanova escribi�:
On 12/16/05, Juan Garc�s Bustamante <jgarces@futuroprofesional.cl> wrote:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;El "ROLLBACK WORK" no aborta la TRANSACTION.
Lo que realmente pasa es lo siguiente:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
-- WARNING: ya estas en una transaccion. Este comando ha sido ignorado.
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
-- Aca se compromete la transaccion que se inicio en la primera linea
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;
-- WARNING: no hay ninguna transaccion abierta.
en verdad ocurrio eso?
Efectivamente, y es el comportamiento esperado :-)
lo voy a probar mas tarde... aunque en postgres no existen las
transacciones anidadas, se llaman savepoints y la sintaxis es distintaBEGIN WORK;
INSERT INTO mitabla VALUES (1);
SAVEPOINT foo;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
RELEASE foo;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;
Esta es la forma correcta de hacerlo.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
On 12/16/05, Alvaro Herrera <alvherre@commandprompt.com> wrote:
Jaime Casanova escribió:
On 12/16/05, Juan Garcés Bustamante <jgarces@futuroprofesional.cl> wrote:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;El "ROLLBACK WORK" no aborta la TRANSACTION.
Lo que realmente pasa es lo siguiente:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);BEGIN TRANSACTION;
-- WARNING: ya estas en una transaccion. Este comando ha sido ignorado.
ahhh, esto es lo que me molestaba...
aqui lei el otro dia que si ejecutas un CLOSE cursor sobre un cursor
ya cerrado da un error, lo cual parece logico...
http://archives.postgresql.org/pgsql-bugs/2005-12/msg00133.php
porque BEGIN entonces solo da un Warning cuando de hecho es incorrecto tenerlo?
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
cc: pgsql-es-ayuda@postgresql.org
para responder siempre a la lista puedes usar reply-all por lo general
basta con eso
On 12/16/05, Juan Garcés Bustamante <jgarces@futuroprofesional.cl> wrote:
Hola
Gracias por responder. No sabía que había una lista en español, sólo me
encontré la de ingles, gracias por redirigirme.
a mi me paso lo mismo ;)
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.Si tienes alguna idea te lo agradecería mucho,
Gracias.
añade una bandera a tu funcion 2
function mi_funcion_2(bool independiente) {
if (independiente) ...sql_query("BEGIN TRANSACTION");
...sql_query("INSERT INTO mitabla VALUES (2)");
...sql_query("INSERT INTO mitabla VALUES (3)");
if (independiente) ...sql_query("COMMIT TRANSACTION");
}
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
Import Notes
Reply to msg id not found: 20051216200802.M13561@futuroprofesional.cl
Juan Garc�s Bustamante wrote:
Hola
Estoy trabajando con Postgres 8.0.3 en Ubuntu.
Necesito realizar transacciones anidadas, pero no logro que se aborten
transacciones intermedias al abortarse una superior.
The main language spoken here is english. If you ask your questions in english,
you'll have a much higher chance of someone answering. If you'd rather post
in spanish, you could subscribe to a spanish postgresql list (I believe there is one).
Ejemplo:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;El "ROLLBACK WORK" no aborta la TRANSACTION.
You cannot nest transactions that way. Instead, start the outer transaction with
"begin", and the inner transaction with "savepoint <name>". You can then rollback
to a savepoint with "rollback to <name>", and rollback the whole transaction
with just "rollback". Instead of commiting a savepoint, you release it.
(With "release <name>").
Your example should therefor look like this:
begin;
insert into mitabla values (1) ;
savepoint sp1 ;
insert into mitablea values (2) ;
insert into mitabla values (3) ;
release sp1 ;
insert into mitabla values(4) ;
rollback;
Resultado de la consulta:
mitabla
========
1
2
3
(3 rows)
What probably happened is that your second "begin" was ignored by postgres -
with a warning like "Warning: Already inside transaction" i'd guess.
Your commit then comitted everything from the first begin on, therefor
comitting values 1,2,3. Additionally, I guess that you have autocommit set
to "off". This causes psql to start a new transaction for the value "4", because
in autocommit=off mode psql will not let you execute commands outside a transaction.
Your final rollback then rolled back that transaction, removing 4 from the table,
but leaving 1,2,3 in place.
Resultado esperado:
mitabla
========(0 rows)
Try my corrected example, it should report "0 rows" ;-)
greetings, Florian Pflug
On Fri, Dec 16, 2005 at 03:23:07PM -0400, Juan Garc�s Bustamante wrote:
Hola
Guten Abend !
Estoy trabajando con Postgres 8.0.3 en Ubuntu.
Hm, ich benutze Debian, mit PostgreSQL 7.4 in einem Cluster.
Wie das bei Ubuntu so funktioniert, wei� ich nicht so
richtig.
Necesito realizar transacciones anidadas, pero no logro que se aborten
transacciones intermedias al abortarse una superior.
Ich glaube Du mu�t Savepoints benutzen, wenn Du eine
Zwischentransaktion innerhalb einer anderen starten willst.
Es nat�rlich klar, da� innerhalb *einer* Transaktion jeder
Fehler die gesamte Verarbeitung abbricht !
Ejemplo:
BEGIN WORK;
INSERT INTO mitabla VALUES (1);
BEGIN TRANSACTION;
INSERT INTO mitabla VALUES (2);
INSERT INTO mitabla VALUES (3);
COMMIT TRANSACTION;
INSERT INTO mitabla VALUES (4);
ROLLBACK WORK;El "ROLLBACK WORK" no aborta la TRANSACTION.
Das kann ich mir nicht vorstellen. Bist Du sicher, da� BEGIN
TRANSACTION die richtige Syntax ist f�r das, was Du machen
willst ?
Resultado de la consulta:
mitabla
========
1
2
3
(3 rows)
Ach so, klar, mE k�nnen BEGINs geschachtelt werden, ohne da�
ein Problem auftritt. Allerdings beendet dann COMMIT alle
begonnenen Transaktionen auf einmal. Da das INSERT ... 4
erst nach dem COMMIT, aber vor dem ROLLBACK kommt, wird es
richtig von dem ROLLBACK erfasst und erscheint nicht in der
Tabelle.
Resultado esperado:
mitabla
========(0 rows)
Nee, nee. Deine Erwartung an das Ergebnis ist falsch.
Alguna idea??
Naja, siehe oben :-)
Gracias.
Kein Problem. Gern wieder.
Karsten
--
GPG key ID E4071346 @ wwwkeys.pgp.net
E167 67FD A291 2BEA 73BD 4537 78B9 A9F9 E407 1346
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)
Import Notes
Reply to msg id not found: 20051216203049.M78913@futuroprofesional.cl
Jaime Casanova escribi�:
On 12/16/05, Alvaro Herrera <alvherre@commandprompt.com> wrote:
BEGIN TRANSACTION;
-- WARNING: ya estas en una transaccion. Este comando ha sido ignorado.ahhh, esto es lo que me molestaba...
aqui lei el otro dia que si ejecutas un CLOSE cursor sobre un cursor
ya cerrado da un error, lo cual parece logico...
http://archives.postgresql.org/pgsql-bugs/2005-12/msg00133.phpporque BEGIN entonces solo da un Warning cuando de hecho es incorrecto tenerlo?
NPI. Ya era asi cuando yo llegue :-) (De hecho creo que el codigo que
salio de Berkeley ya era asi). No hay ninguna explicacion de _por que_
es asi en el codigo. src/backend/access/transam/xact.c
BeginTransactionBlock()
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
On 12/16/05, Alvaro Herrera <alvherre@commandprompt.com> wrote:
Jaime Casanova escribió:
On 12/16/05, Alvaro Herrera <alvherre@commandprompt.com> wrote:
BEGIN TRANSACTION;
-- WARNING: ya estas en una transaccion. Este comando ha sido ignorado.ahhh, esto es lo que me molestaba...
aqui lei el otro dia que si ejecutas un CLOSE cursor sobre un cursor
ya cerrado da un error, lo cual parece logico...
http://archives.postgresql.org/pgsql-bugs/2005-12/msg00133.phpporque BEGIN entonces solo da un Warning cuando de hecho es incorrecto tenerlo?
NPI.
No Poseo Información supongo ;)
Ya era asi cuando yo llegue :-)
Esto si me parecio insultante... ya pareces latino...
(De hecho creo que el codigo que
salio de Berkeley ya era asi). No hay ninguna explicacion de _por que_
es asi en el codigo. src/backend/access/transam/xact.c
BeginTransactionBlock()
ya mande un mail a -hackers... no me quedare con la pica...
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)
Jaime Casanova escribi�:
On 12/16/05, Alvaro Herrera <alvherre@commandprompt.com> wrote:
Jaime Casanova escribi�:
NPI.
No Poseo Informaci�n supongo ;)
Ni P*ta Idea ;-)
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
NPI.
No. por ACA ES
Ni Puta Idea :)
No Poseo Informaci�n supongo ;)
Ya era asi cuando yo llegue :-)
Esto si me parecio insultante... ya pareces latino...
(De hecho creo que el codigo que
salio de Berkeley ya era asi). No hay ninguna explicacion de _por que_
es asi en el codigo. src/backend/access/transam/xact.c
BeginTransactionBlock()ya mande un mail a -hackers... no me quedare con la pica...
--
Alvaro HerreraPostgreSQL Replication, Consulting, Custom Development, 24x7 support
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)---------------------------(fin del mensaje)---------------------------
TIP 3: si publicas/lees desde Usenet, por favor env�a "subscribe-nomail"
a majordomo@postgresql.org para que tus mensajes puedan llegar
a los suscriptores de la lista
_________________________________________________________________
De todo para la Mujer Latina http://latino.msn.com/mujer/
On 12/19/05, Edwin Quijada <listas_quijada@hotmail.com> wrote:
NPI.
No. por ACA ES
Ni Puta Idea :)No Poseo Información supongo ;)
Ya era asi cuando yo llegue :-)
Esto si me parecio insultante... ya pareces latino...
ejem... por aca tambien...
--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)