Re: Bit by "commands ignored until end of transaction block" again - Mailing list pgsql-sql

From Craig Ringer
Subject Re: Bit by "commands ignored until end of transaction block" again
Date
Msg-id 1248652828.2303.5.camel@ayaki
Whole thread Raw
In response to Re: Bit by "commands ignored until end of transaction block" again  (Science <science@misuse.org>)
Responses Re: Bit by "commands ignored until end of transaction block" again
List pgsql-sql
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 =>
SAVEPOINTFoo      Foo.connection.execute('--some sql code') # SQL => '--some sql code'    }                 # SQL =>
RELEASESAVEPOINT 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



pgsql-sql by date:

Previous
From: Science
Date:
Subject: Re: Bit by "commands ignored until end of transaction block" again
Next
From: Science
Date:
Subject: Re: Bit by "commands ignored until end of transaction block" again