From: Craig Ringer <craig@postnewspapers.com.au>
To: Chris <dmagick@gmail.com>
Cc: Joshua Tolley <eggyknap@gmail.com>
Cc: Glenn Maynard <glenn@zewt.org>
Cc: Richard Huxton <dev@archonet.com>
Cc: pgsql-sql@postgresql.org
Subject: Re: Bit by "commands ignored until end of transaction block" again
Date: Fri, 24 Jul 2009 17:43:42 +0800
Message-ID: <1248428622.1101.188.camel@tillium.localnet> (raw)
In-Reply-To: <4A680C03.6040701@gmail.com>
References: <bd36f99e0907222158k6b4b3a0al65766c0d9c4906cf@mail.gmail.com>
<4A67F5B6.4080409@archonet.com>
<bd36f99e0907222304x38cfa50bkeba19f7c9b2694@mail.gmail.com>
<20090723064656.GO25450@eddie>
<4A680C03.6040701@gmail.com>
On Thu, 2009-07-23 at 17:06 +1000, Chris wrote:
> Joshua Tolley wrote:
> > On Thu, Jul 23, 2009 at 02:04:53AM -0400, Glenn Maynard wrote:
> >> On Thu, Jul 23, 2009 at 1:31 AM, Richard Huxton<dev@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.
[snip]
> You haven't explicitly started a transaction, therefore savepoints won't
> work.
True. However, he's talking about code within a PL/PgSQL function. To a
PL/PgSQL function there is NO difference between:
begin;
select my_function();
commit;
and a standalone:
select my_function();
in both cases the statement executes in a transaction, and in both cases
individual statements within the function are within the same
transaction. That's why any function can EXCEPTION blocks, etc, which
rely on savepoints.
--
Craig Ringer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-sql@postgresql.org
Cc: craig@postnewspapers.com.au, dmagick@gmail.com, eggyknap@gmail.com, glenn@zewt.org, dev@archonet.com
Subject: Re: Bit by "commands ignored until end of transaction block" again
In-Reply-To: <1248428622.1101.188.camel@tillium.localnet>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox