I think the problem is that you only ensure one of the Refs. If you
want to make sure that a condition between multiple Refs isn't
violated, you need to sure all of them. Otherwise other transactions
will be free to modify the Refs that aren't ensured.

On Tue, Sep 15, 2009 at 3:14 PM, Krukow <karl.kru...@gmail.com> wrote:
>
> After a discussion in dcug about the write-skew anomaly, I wanted to
> write a program exhibiting the anomaly, together with a similar
> program using ensure to eliminate it.
>
> My program doesn't work: it exhibits the anomaly, but ensure doesn't
> fix it, and neither does adding a validator to the refs. I'd like to
> know if it is a bug in my program, in my understanding of 'ensure' and/
> or validators, or, finally, in Clojure.
>
> The program simulates the write-skew example from wikipedia: there are
> two accounts a1 and a2 initially holding $100 each, and the bank
> requires that @a1 + @a2 >= 0 always. A user concurrently tries two
> transactions: one withdrawing $200 from a1 and one withdrawing $200
> from a2. The bank code checks that @a1 + @a2 >= 200 before
> transferring any money. With serializable transaction-semantics, the
> bank's constraint is never violated; with snapshot-isolation
> semantics, it may be violated.
>
> I have four programs. The first is intended to exhibit the write-skew
> anomaly, and it works as intended: after running a few times, a state
> with @a1 = @a2 = -100 may be observed.
>
> http://paste.lisp.org/display/87117
>
> The second is intended to elibinate the write-skew anomaly, by letting
> the changing transactions use ensure:
>
> http://paste.lisp.org/display/87117#1
>
> The third program tries to eliminate the write-skew by using
> ref :validator instead (also ensures both refs!)
>
> http://paste.lisp.org/display/87117#2
>
> Finally, I wrote a serialized version using an agent. As expected
> there is no write-skew.
>
> http://paste.lisp.org/display/87117#3
>
> Help?

-- 
R. Mark Volkmann
Object Computing, Inc.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to