[ZODB-Dev] Undo differences between Z2 and Z3

Chris Withers chris at simplistix.co.uk
Thu May 18 02:30:24 EDT 2006


Jim Fulton wrote:
> Logical inconsistencies.  Consider two transactions, T1
> and T2 that run the same code:
> 
>   def f():
>       if 'x' not in somefolder:
>           somefolder['x'] = 42
> 
> The postcondition of the transaction is that somefolder
> has an item named 'x' with the value 42.
> 
> Now, when T2 runs, it doesn't add the item to the folder,
> because T1 added it.  We can undo T2 without problem.

Ah, okay.

> If we undo T1 without undoing T2, we do have a problem.
> Our current system doesn't detect the coflict between T2 and T1
> because T2 read the folder but didn't write it.  We don't track
> reads, so we don't recognize the conflict.

Even if you did track reads, how would you distinguish an "unsafe" read 
as above from a "normal" read that shouldn't cause a conflict?

> Ther are many situations where the benefits of undo outweight the risks,
> which is why I still favor making it available as an adminstrative feature.

Indeed, and provided the transactions created by the application are 
careful to avoid problems of the above type, I think it's safe to 
provide "full" undo support, but the burden _is_ then on the app 
developer to make sure they do nothing unsafe when it matters.

> For now, the issue is mostly moot, since in most applications,
> transactions you want to undo tend to conflict with later ones, even
> with the limited conflict detection we use now.

Hmmm, I guess a "copy to present" system, as provided in History.py, 
might well do better for "application level" undo...

cheers,

Chris

-- 
Simplistix - Content Management, Zope & Python Consulting
            - http://www.simplistix.co.uk



More information about the ZODB-Dev mailing list