[Zope-DB] question on zope DAs

Matthew T. Kromer matt@zope.com
Tue, 16 Oct 2001 17:10:58 -0400


Tom Jenkins wrote:

>Hello all,
>We're trying to track down a problem that may be related to a database
>adapter (DA).  We've looked at a couple of different DA's and noticed
>discrepancies between them in the _begin method.
>

[...]

>
>looks like zpsycopg rollbacks any uncommited transactions before
>starting another, both zpopy & DCOracle2 ignore calls to _begin,
>zpygresql issues a begin transaction call (?) but gvibda is
>interesting.  It does a count query against a known database to see if
>the connection is still up; if not it will create another connection and
>cursor.
>
>Which is more correct?  The interbase (gvibda) is interesting as it
>looks like it will reconnect if it can't get a response.
>


We've had some interesting discussions about RDBMS support w.r.t. the 
Zope transaction machinery.  The problem (as you notice) has to do with 
trying to synchronize transactions.

Generally, there's going to be some kind of commit() function called 
when Zope commits a transaction, or an abort() when Zope rolls it back. 
 OK, so far so good... :)  A side effect of this means that as long as a 
connection object is not shared between threads (and thus between 
transactions) except via a commit/abort boundary, you dont have to be 
precise about starting a new transaction (IMHO -- I dont know that all 
DB systems dont want an explicit "transaction start" mechanism to be 
invoked.)

The kicker is that rollback is really two-phase in Zope, and that some 
RDBMS DAs may do the wrong thing, or the right thing at the wrong time. 
 Here's a message URL that was referred to in an e-mail recently:

    http://aspn.activestate.com/ASPN/Mail/Message/525729

in which some similar issues are discussed.  The gist of the argument is 
that the DA shouldnt commit data until the ZODB has done its first phase 
commit (ie no conflicts or errors), and instead should work on the 2nd 
half.  Aborts though, need to abort everything, including ZODB.

Techically, the DA should support a two-phase commit protocol, where it 
gets a "prepare" to commit and a final "commit."  I dont know of any 
which do this, though.

And as an aside, database connection/recovery for detecting stale or 
lost connections is very ad hoc.   Its something that I want to see 
changed sometime.  Some DA's (ZOracleDA is one) just try to open the 
connection again on an error.

I'd also endorse a notion of setting transaction ids for RDBMS systems 
which support it, so that a single connection object can participate in 
multiple transactions.  This is not a high priority in Fredericksburg, 
though.