I'm working with Theuni on the BlobStorage, and am trying to understand the
different 2-Phase-Commit protocols that are in use in ZODB at the same time.
As I understand it, tpc_* is the old protocol, and prepare/commit is the new
The sequence in Transaction._commitResources is
tpc_begin (ignored by DataManagerAdapter)
tpc_vote (translated to prepare)
tpc_finish (translated to commit)
Which means, the old protocol is completed first, before the new protocol is
Now, Connection uses the old protocol, and we've got a BlobDataManager that uses
the new protocol. The BlobDataManager needs to do work during prepare, but it is
only called to do this work *after* the Connection has already committed.
Needless to say, the commit fails, because the preparation hasn't been done.
Maybe I misunderstood the protocol and the preparation work should be handled
differently. In any case I'm rather confused by this double-protocal situation
and would be grateful if someone enlightened me here.
For more information about ZODB, see the ZODB Wiki:
ZODB-Dev mailing list - ZODB-Dev@zope.org