Clojureを初めて使用し、トランザクションモデルを理解しようとしています。 alter
とcommute
で遊んでいるとき、私はの後にrefをcommute
とした場合、トランザクションは何もコミットしない(または何も変更しない)ことに気付きました。Clojure:1つのトランザクション内で変更する前に通勤するとトランザクションが失敗する
例えば:
(def counter (ref 0))
(def i (ref 0))
(future (dosync
(ref-set counter 1)
(ref-set i 1)
(commute counter inc)
(alter counter inc)))
@counter
と@i
両方が0になり、私はcommute
とalter
を交換するか、この場合、2つのcommute
S又は二alter
Sを使用する場合、それは、所望の結果を生成する(図3及び1)。
私はcommute
とalter
の行動はそのcommute
で少し異なっていることを説明するいくつかの記事を読んだが、実際のトランザクション(それはスタンド1、「コミット」の段階で他)で2回実行し、一貫性のない無視されますrefのスナップショット。私はちょうどこれらの2つの組み合わせの奇妙な動作に混乱しています。
誰でもどのように動作するのか説明できますか?前もって感謝します!
clojure 1.8:これはrepl '{:status:failed、:val #error {:原因"通勤の後に設定できません ":via {{:type java.util.concurrent.ExecutionException ...' so '通勤 'の後に'変更'しないでください。特定のドキュメントを見つけることができませんでした - ちょうど[ソース](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LockingTransaction.java#L428) – birdspider