[Zope] Re: [ZODB-Dev] sessions in the presence of conflicts

Dieter Maurer dieter at handshake.de
Thu Dec 15 12:00:50 EST 2005


Dennis Allison wrote at 2005-12-14 12:58 -0800:
> ...
>_p_resolveConflict(self, oldState, savedState, newState) 
>
>returns the state of the object after resolving different changes.  The 
>arguments are:
>
>   oldState   -- state of the object at the beginning of the current 
>	         transaction (mutable)
>   savedState -- state currently stored in the database.  This state 
>                 was written after oldState and reflect changes made
>                 by a transaction that committed before the current
>                 transaction (immutable)
>   newState   -- state after changes made by the current transaction 
>	         (immutable)
> ...
>It seems to me that we can do much better for sessions because we know a
>bit about the semantics of sessions.  A session object is a
>dictionary-like object mapping key-value pairs.  Adding or deleting keys
>or changing the value associated with a key are independent operations and
>do not conflict unless the keys are duplicated in both the transactions.  
>Any conflict resolution mechanism needs to be able to manage multiple keys
>independently since the session object is modified as a unit.   In 
>addition, new keys may be added and old keys deleted; any conflict 
>resolution mechanism at the key level needs to be comprehend those 
>operations.
>
>A more session-friendly conflict resolution might use:
>
>   1.  if any of the states are invalid (that is, has a key '_invalid')
>       return the invalid state.
>
>   2.  if any any of the states attributes ['token','id','_created']
>       differ then there is a conflict, raise the conflict exception. 
>
>   3.  order the newState and savedState by modification time (or if that
>       cannot be computed, by access time).   

        "newState" is always after "savedState" ("saveState" represents
	a formerly committed state, "newState" the current state the
	commit of which failed).

>   4.  any key appearing in oldState's dictionary but not appearing in 
>       both savedState and newState should be removed from all.  This 
>       corresponds to a key-value pair being deleted in one of the 
>       transactions.  Insertions will be managed automatically by 
>       the updates.

That looks doubtful: It means, if any of the transactions deletes
the key, then it should be removed. You favour deletion a bit.

>   5.  beginning with the oldest, update oldState dictionary of key-value 
>       pairs using the dictionary part of newState and savedState.  Return 
>       oldState.
> ...

-- 
Dieter


More information about the Zope mailing list