Hi,
Am Donnerstag, 21. November 2013 11:19:54 UTC+1 schrieb Jim foo.bar:
>
> On 20/11/13 19:36, juan.facorro wrote:
>
> The value for all refs whose value you don't actually modify inside a
> transaction should be obtained through
> ensure<http://clojuredocs.org/clojure_core/clojure.core/ensure>
> if you want to make sure :P their value won't be changed by a different
> transaction, that way you get a consistent value when the current
> transaction is finally committed.
>
>
> ok this is an interesting and relevant for me comment....let's take a step
> back. Assume the same bank from my previous example and consider the
> following function:
>
> (defn total!
> "Sum all accounts safely with a consistent view even if other
> transactions are still running."
> [bank]
> (dosync
> (reduce +'
> (map (comp :curr-balance second) *@bank*))))
>
> What would be the implications of changing the bold bit to *(ensure bank)
> *?
>
>
For this you don't even need a transaction. As long as you bank doesn't
contain other refs, this is perfectly fine. With the deref you get a
snapshot.
ensure is only needed when you want to change a ref based on the value of
another ref, but you only read the other ref. See this example:
(defn maybe-launch-rockets!
[defcon command-queue]
(dosync
(when (= :war (ensure defcon))
(alter command-queue conj :launch-rockets))))
Here you change command-queue purely based on the value of defcon without
modifying defcon. Then you have to use ensure to get a consistent view of
both refs. Without using ensure, you might get the following situation:
1. Your transaction starts.
2. You read defcon.
3. A peace treaty is signed and another transaction resets defcon to :peace.
4. You schedule the rocket launch based on a now bogus defcon value.
5. Your transaction commits, because you did not modify defcon and thusly
don't get a conflict.
6. 3rd world war ensues.
ensure declares your interest in defcon. You get a conflict and the above
cannot happen. (In fact: you block the peace treaty negotiations until the
rockets are launched, but that is an implementation detail.)
Hope that helps.
Meikel
--
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.