[ZODB-Dev] Setting _p_changed on a ghost

Jim Fulton jim at zope.com
Thu Sep 1 08:42:39 EDT 2005


Dieter Maurer wrote:
> Tim Peters wrote at 2005-8-26 14:59 -0400:
> 
>>...
>>I would like to make it an error (raise a ValueError exception) to attempt
>>to set obj._p_changed to a true value when obj is a ghost.  Does anyone
>>object?
> 
> 
> I came along an argument against this change:
> 
>   Assume, you have a persistent object "o" with a mutable
>   non persistent attribute "a".
> 
>   One of the idioms for changing "a" looks like:
> 
>       ... modify "o.a" ...
>       o._p_changed = True
> 
>   However, as Shane pointed out, this may cause ZODB inconsistencies:
> 
>       When "... modify "o.a" ..." raises an exception,
>       then "a" may or may not already have been modified.
>       Such changes may be committed in a future transaction
>       (not the current one, as this is aborted).
> 
>   Therefore, he proposed to change the idiom to:
> 
>       o._p_changed = True
>       ... modify "o.a" ...
> 
>   Now, the persistence subsystem (hopefully) already knows the "o" is changed
>   and invalidates it on abort. The inconsistency cannot occur.
> 
>   Of course, raising an exception when "o" happens to be
>   a "ghost", would not be appropriate for this idiom -- neither
>   is the current behaviour to just ignore the assignment
>   to "_p_changed".

This is an excellent argument.

+1 on _p_changed=1 deghostifying, if necessary.

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