Re: Nested Transaction TODO list - Mailing list pgsql-hackers

From Oliver Jowett
Subject Re: Nested Transaction TODO list
Date
Msg-id 40E76B28.7080801@opencloud.com
Whole thread Raw
In response to Re: Nested Transaction TODO list  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Nested Transaction TODO list  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Tom Lane wrote:

> I don't like using ParameterStatus because it's not designed for dealing
> with values that may change many times in a single query.  Also it sends
> strings, which this really isn't.

What about including the new nesting level in the 
SUBBEGIN/SUBCOMMIT/SUBABORT CommandStatus string? Yes, it's still a 
string for a numeric nesting level, but that's also how we pass numeric 
data such as insert/update rowcounts.

> I haven't looked at JDBC, but at least in the libpq code, what we could
> safely do is extend the existing no transaction/in transaction/in failed
> transaction field to provide a five-way distinction: those three cases
> plus in subtransaction/in failed subtransaction.  You could not directly
> tell the depth of your subxact from this, but do you need to?

This will break the existing JDBC driver in nonobvious ways: the current 
code silently ignores unhandled transaction states in ReadyForQuery, so 
you could conceivably end up in situations where the driver thinks 
you're outside a transaction when you're actually inside a 
subtransaction, and issues spurious BEGINs. It's simple enough to handle 
the new states, but it *is* an incompatible protocol change. Please bump 
the protocol version if you do make this change. And if you're going to 
bump the protocol version, I have some other changes I'd like to see at 
the same time :)

If named SAVEPOINT syntax (along the lines of what Oracle has) is 
available in 7.5, and there is a mechanism to COMMIT/ROLLBACK the 
top-level transaction directly, the JDBC driver doesn't actually need to 
know anything about subtransactions to correctly implement JDBC's 
commit, rollback, & savepoint interface -- except perhaps to deal with 
the case where the application rolls back a subtransaction which 
invalidates an earlier SAVEPOINT. Having the nesting level available 
will probably make savepoint support a bit easier but it's not vital.

If we don't have COMMIT/ROLLBACK of top-level transactions, then the 
JDBC driver needs to know the current nesting level so it knows how many 
subtransactions to deal with when a top-level commit/rollback is 
requested via the JDBC API. I'd actually prefer to see plain COMMIT and 
ROLLBACK continue to operate on the top-level transaction, since doing 
anything else is going to break pre-7.5 clients (such as older JDBC 
drivers) that assume that you're entirely outside a transaction after 
COMMIT/ROLLBACK.

If we don't have SAVEPOINT syntax, then the JDBC driver needs to know 
the current nesting level so it can track which (client-maintained) 
savepoints are still valid in the face of the application doing 
subtransaction work itself.

The only other thing the JDBC driver uses the transaction state for is 
to work out when BEGINs are needed when JDBC-level autocommit is off, 
and when to allow transaction isolation level changes. As far as I can 
see, "in subtransaction" is equivalent to "in top-level transaction" for 
both of those cases.

So overall, knowing that you're in a subtransaction without knowing the 
nesting level does not seem very useful..

-O


pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: I am back from Germany and Armenia
Next
From: Oliver Jowett
Date:
Subject: Re: [Re] Re: PREPARE and transactions