Tom Lane wrote:
Still need to agree about externally visible behavior (a different stmt than begin/commit for subxacts? What about savepoints?) Also, what about exposing this functionality in plpgsql? Seems like we need some kind of exception handling syntax to make this useful. What does Oracle do?
As I just mentioned in another thread, whatever the syntax for nested transactions I'd like to see plain COMMIT/ABORT/ROLLBACK always affect the top-level transaction.
Oracle appears to have:
SAVEPOINT savepointname ROLLBACK [WORK] [TO [SAVEPOINT] savepointname]
You can issue SAVEPOINT with the same name while the old savepoint is valid, and the name will be moved. Rolling back to a savepoint does not invalidate that savepoint, i.e. you can roll back to a savepoint multiple times.
One generalization of this to nested transactions would be:
SUBBEGIN [transactionname] SUBCOMMIT [transactionname] SUBABORT [transactionname]
SUBBEGIN outside an explicit transaction block works like BEGIN.
Active transactions may have names. SUBBEGIN with a name associates the name with the new transaction; if the name is already in use, it's also removed from the old transaction. Alternatively we could only look at the most-deeply-nested transaction with a given name when specifying transactions by name. That would make savepoint behaviour slightly different to Oracle (Oracle could see a savepoint as invalid that we consider valid), but it looks like it'd make things a bit easier for procedural languages as functions can't accidentally trash a name "belonging" to your caller so long as they resolve all transactions they start.
SUBCOMMIT or SUBABORT work on the current transaction level (if no name is specified) or all transactions down to (and including) the named transaction level if a name is given.
"SAVEPOINT savepointname" becomes an alias for "SUBBEGIN savepointname". "ROLLBACK TO [SAVEPOINT] savepointname" becomes an alias for "SUBABORT savepointname; SUBBEGIN savepointname".
We could spell SUBBEGIN and friends differently -- is it better to add more syntax to the existing transaction manipulation commands along the lines of "BEGIN [NESTED] [TRANSACTION|WORK] [transactionname]", "ROLLBACK [NESTED] [TRANSACTION|WORK] [transactionname]" etc?
Any comments?
-O
---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives?
http://archives.postgresql.org