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