[Zope-dev] Re: [ZCM] [ZC] 869/ 5 Comment "Broken transaction handling in case of exceptions"

Florent Guillaume fg@nuxeo.com
Tue, 08 Apr 2003 20:05:38 +0200


Toby Dickenson wrote:
> > Ok, from your exlanations, MemberDataTool should be now safe -- I
> > patched it a few weeks ago to clear the cache at the end of the
> > transaction using REQUEST._hold.
> 
> BTW, I use the attatched class to delete an attribute from an object at the 
> end of a transaction. This is a little safer than REQUEST._hold in cases 
> where request boundares are not aligned with transactions. Should this go in 
> ZODB somewhere?

It would be nice, yes. It would provide a better abstraction that 
REQUEST._hold and if you say it's safer, then that's a win too.

Regarding Steve's suggestion:
 > I'd like to see attributes that get cleared at transaction boundaries
 > made a first-class feature of the ZODB.
 > This might be implemented for attributes starting with _x_ where x is
 > The letter of your choice, following a similar pattern to _v_ and _p_
 > attributes.

It would be also very useful. _v_ is volatile, but not volatile enough... :)

Florent



> ------------------------------------------------------------------------
> 
> """
> attribute_cleaner
> 
> A class to remove an attribute from an object at the end of a 
> transaction. This is useful for attributes that hold
> transaction-specific caches.
> 
> Normal operation is::
> 
>     if self._v_cache is None:
>         self._v_cache = create_data_to_cache()
>         attribute_cleaner(self,'_v_cache')
> """
> 
> class attribute_cleaner:
>     def __init__(self,client,attr):
>         self.client = client
>         self.attr = attr
>         get_transaction().register(self)
> 
>     def sortKey(self):
>         return repr(self)
> 
>     def ClearCache(self,*args):
>         try:
>             delattr(self.client, self.attr)
>         except AttributeError:
>             pass
>         except KeyError:
>             pass
> 
>     tpc_finish = tpc_abort = abort = abort_sub = ClearCache
> 
>     def tpc_begin(self,transaction,subtransaction=None): pass
>     def commit(self,object,transaction): pass
>     def tpc_vote(self,transaction):      pass
>     def commit_sub(self,transaction):    pass
> 

-- 
Florent Guillaume, Nuxeo (Paris, France)
+33 1 40 33 79 87  http://nuxeo.com  mailto:fg@nuxeo.com