Re: Bit by "commands ignored until end of transaction block" again

Поиск
Список
Период
Сортировка
От Joshua Tolley
Тема Re: Bit by "commands ignored until end of transaction block" again
Дата
Msg-id 20090723064656.GO25450@eddie
обсуждение исходный текст
Ответ на Re: Bit by "commands ignored until end of transaction block" again  (Glenn Maynard <glenn@zewt.org>)
Ответы Re: Bit by "commands ignored until end of transaction block" again  (Chris <dmagick@gmail.com>)
Re: Bit by "commands ignored until end of transaction block" again  (Alvaro Herrera <alvherre@commandprompt.com>)
Список pgsql-sql
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. 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

В списке pgsql-sql по дате отправления:

Предыдущее
От: Shane Ambler
Дата:
Сообщение: Re: Need magical advice for counting NOTHING
Следующее
От: "A. Kretschmer"
Дата:
Сообщение: Re: Need magical advice for counting NOTHING