我在clojure.org/refs讀到STM交易中的參考是否真的一致?
參考文獻的所有讀取會看到「參考世界的一致性快照作爲交易的起點(其「讀點」)。交易將看到它所做的任何更改。這被稱爲交易中的價值。
還有一個關於維基百科Snapshot Isolation的鏈接,暗示任何數量的refs的讀取在事務開始後都會彼此一致。
我做了一個試驗案例...
(def r1 (ref 0))
(def r2 (ref 0))
(defn delay-then-inc-ref [id ref delay]
(.start
(Thread.
#((println id " start")
(Thread/sleep delay)
(dosync
(alter ref inc))
(println id " end")))))
(defn deref-delay-deref [ref1 ref2 delay]
(.start
(Thread.
#((println "S start")
(dosync
(let [a @ref2]
(Thread/sleep delay)
(println "S r1=" @ref1))) ; @ref1 consistent with @ref2 ?
(println "S end")))))
*clojure-version*
;=> {:major 1, :minor 3, :incremental 0, :qualifier nil}
(deref-delay-deref r1 r2 2000)
(delay-then-inc-ref "1" r1 500)
(delay-then-inc-ref "2" r1 1000)
(delay-then-inc-ref "3" r1 1500)
輸出是:
S start
1 start
2 start
3 start
1 end
2 end
3 end
r1 = 3
S end
nil
的r1 = 3
而非r1 = 0
值表明,deref-delay-deref
REF1的sleep
後DEREF正在復甦後三個交易發生後的值。
請注意,我知道約ensure
到阻止在特定交易期間通過其他交易更新引用,但我不相信這適用於此處。我不在乎ref1
是否會發生變化,只要我看到一個與我的交易開始時一致的值即可。
這種行爲如何符合上述參考文檔?
因爲我回答了我自己的問題,我將這個答案標記爲社區wiki,根據meta.stackoverflow.com提供的禮儀建議 – sw1nn 2012-04-16 20:14:26