[Zope-dev] is there a hook for before the transaction is committed
Steve Alexander
steve@cat-box.net
Mon, 05 Mar 2001 20:21:59 +0000
John D. Heintz wrote:
> Hi Tim,
>
> I have two suggestions, I hope one of them helps.
>
> 1) Attached is a TM.py file that I wrote based on the one you mention
> below. I've tried to make it more obvious and better documented.
>
> 2) Don't use this kind of functionality, but rather use sub-transaction
> commits.
>
> The first suggestion has more overhead than what I assume you would
> need, but the second one won't work for all situations.
>
> A Fishbowl proposal of mine, HashingSupport, was going to use the same
> kind of hook you are asking about. In this case though, using
> sub-transaction commits made a lot more sense.
>
> In general though, I think that _v_* attributes pose a non-trivial
> problem that probably requires a hook on abort() if not commit() as well.
Take a look at ZPatterns; specifically, the classes Keeper and Kept from
ZPatterns/Transactions.py
You can see examples of how they are used in DataSkins.py and Rack.py,
although there really isn't much to it.
I've included the docstrings below.
class Keeper:
"""Resets an object's per-transaction cache attributes at txn boundaries
Note that Keepers are created by Kept objects semi-automatically,
and there is usually no need to create one manually. A Keeper
automatically registers itself with the Zope transaction upon
creation, and instructs its Kept client to clear its per-transaction
cache at all transaction boundaries. Keeper methods are called only
by the Zope transaction, so don't mess with them."""
class Kept(Base):
"""Thing which has a Keeper to clear its per-transaction cache.
Objects derived from Kept should reference the 'self._v_Keeper'
attribute whenever they need to flag that they have made changes to
their cache that would require it to be cleared. (Note that
'_v_Keeper' is an *attribute*, not a method, and so should not be
called, just referenced.)
Once this has been done, the next transaction state transition
that occurs (sub/main transaction commit or abort) will cause
the object's Keeper to call for a cache reset.
Subclasses of Kept should define a '__per_transaction_cache_attrs__'
attribute as a sequence of attributes which they would like to have
deleted from their '__dict__' at reset time.
"""