pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Craig Ringer <craig@postnewspapers.com.au>
To: Science <science@misuse.org>
Cc: pgsql-sql@postgresql.org
Subject: Re: Bit by "commands ignored until end of transaction block" again
Date: Mon, 27 Jul 2009 08:00:28 +0800
Message-ID: <1248652828.2303.5.camel@ayaki> (raw)
In-Reply-To: <4A6CE37B.9020709@misuse.org>
References: <4A6CE37B.9020709@misuse.org>

On Sun, 2009-07-26 at 19:15 -0400, Science wrote:

> FWIW, the way the Rails ORM ActiveRecord (another fairly damaged ORM) 
> handles this is by allowing you to open any number of transaction 
> blocks, but only the outer transaction block commits (in Pg):
> 
> Property.transaction { # SQL => 'BEGIN'
>    User.transaction {
>      Foo.transaction {
>        Foo.connection.execute('--some sql code') # SQL => '--some sql code'
>      }
>    }
> } # SQL => 'COMMIT'

What happens if, Foo.transaction does something that causes an error,
though, or issues a rollback? It's not creating savepoints, so if
Foo.transaction rolls back it throws out the work of User.transaction
and Property.transaction too.

Ugh.

That design would be quite good _IF_ it used savepoints:


Property.transaction { # SQL => 'BEGIN'
   User.transaction {  # SQL => SAVEPOINT User
     Foo.transaction { # SQL => SAVEPOINT Foo
       Foo.connection.execute('--some sql code') # SQL => '--some sql code'
     }                 # SQL => RELEASE SAVEPOINT Foo
   }                   # SQL => RELEASE SAVEPOINT User
}                      # SQL => 'COMMIT'

... so that inner transactions could ROLLBACK TO SAVEPOINT on error ,
and so that asking for a rollback would give you a ROLLBACK TO SAVEPOINT
if the transaction is a subtransaction.

-- 
Craig Ringer




view thread (19+ messages)  latest in thread

Message-ID: <1248652828.2303.5.camel@ayaki>
Permalink:  ../1248652828.2303.5.camel@ayaki/
Also on:    postgresql.org/message-id/1248652828.2303.5.camel@ayaki

 · 

reply

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, science@misuse.org
  Subject: Re: Bit by "commands ignored until end of transaction block" again
  In-Reply-To: <1248652828.2303.5.camel@ayaki>

* 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