On Thu, Jul 23, 2009 at 02:04:53AM -0400, Glenn Maynard wrote: > On Thu, Jul 23, 2009 at 1:31 AM, Richard Huxton<d...@archonet.com> wrote: > >> - Let me use SAVEPOINT outside of a transaction, > > > > You are never outside a transaction. All queries are executed within a > > transaction. > > "Transaction block", then, if you insist. > > > I think this is the root of your problem - all queries are within a > > transaction so either: > > 1. You have a transaction that wraps a single statement. If you get an error > > then only that statement was affected. > > 2. You have an explicit BEGIN...COMMIT transaction which could use a > > savepoint. > > Savepoints can only be used inside transaction blocks. My function > has no idea whether it's being called inside a transaction block. > > From inside a transaction block, my function would need to call > SAVEPOINT/RELEASE SAVEPOINT. > > If it's not in a transaction block, it needs to call BEGIN/COMMIT > instead. SAVEPOINT will fail with "SAVEPOINT can only be used in > transaction blocks".
Have you tried this? I expect if you give it a shot, you'll find you don't actually have this problem. Really, everything is always in a transaction. If you haven't explicitly opened one, PostgreSQL opens one for you before each statement, and issues a COMMIT afterwards (or a ROLLBACK, if your statement ran into an error). Statements within functions are always executed within the same transaction, so you can issue SAVEPOINT commands anywhere in PL/pgSQL functions without problems, because you're always in a transaction. -- Joshua Tolley / eggyknap End Point Corporation http://www.endpoint.com
signature.asc
Description: Digital signature