Re: Bit by "commands ignored until end of transaction block" again
От | Craig Ringer |
---|---|
Тема | Re: Bit by "commands ignored until end of transaction block" again |
Дата | |
Msg-id | 1248652828.2303.5.camel@ayaki обсуждение исходный текст |
Ответ на | Re: Bit by "commands ignored until end of transaction block" again (Science <science@misuse.org>) |
Ответы |
Re: Bit by "commands ignored until end of transaction block"
again
|
Список | 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 по дате отправления: