[ZODB-Dev] Re: [Zope-dev] Re: post publishing hook

Jim Fulton jim at zope.com
Mon Apr 4 12:09:09 EDT 2005


Jeremy Hylton wrote:
> On Apr 4, 2005 10:38 AM, Jim Fulton <jim at zope.com> wrote:
> 
>>>>If you register a synchronizer with the transaction manager, it's
>>>>beforeCompletion() method will be called immediately before changing
>>>>the transaction's state to committing.  This hook was intended in part
>>>>to support use cases like "do something magic to the transaction
>>>>before it commits."  It looks like the registerSynch() method of the
>>>>transaction manager is undocumented, but that is an oversight.
>>>
>>>
>>>Ok, and I see that beforeCompletion(t) has to check t.status to find out
>>>when it is called (if the transaction is ACTIVE it's ok, otherwise it's
>>>been called by abort() -- the fact that abort() calls it should probably
>>>be documented).
>>
>>I think that this is not the right mechanism.  It's not really
>>intended for application code and is far to complex for what is,
>>IMO, a very simple case.
> 
> 
> I don't have anything invested in the decision, but synchronizers were
> intended to support this use case.  They provide a way for arbitrary
> application code to observe the transaction boundaries without
> pretending to be a data manager.

OK, maybe I missunderstood synchronizers.  Is there any documentation
for them beside the source?

 From reading the source. they don't seem to fit the use case very well:

- They are registered with the TM and are called for subsequent
   transactions until they are unregistered.  This is not what we want
   here.  We want hooks to be called only if the current transaction
   commits.  We want to throw the hooks away at the end of the transaction.
   It's not obvious how to make this work with synchronizers.  (I suppose
   the syncronizer could save the transaction it cares about
   and unregister itself if it sees another.  This is a lot of bother.)

- The synchronizers are called on a commit *or* an abort.
   We want hooks to be called on a commit only.

- Synchronizers have to provide 2 methods, beforeCompletion
   and afterCompletion.  This means that synchornizers have to
   be instances with methods.  For before-completion hooks
   we want to be able to just supply functions.  We'd
   also have to provide a dummy after completion method that
   we don't care about.

My understanding is that synchronizers were added to support
MVCC. They are well suited to supporting data managers
that need to know about transaction boundaries.

I think the use case here would be better served by simple
hooks of the sort I proposed.

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org


More information about the ZODB-Dev mailing list