clojure:在一次交易内变更之前的通勤会导致交易失败



我是Clojure的新手,并且一直在尝试了解其交易模型。在使用altercommute玩时,我注意到,如果我在commute之后alter ref,则交易将不会提交任何内容(或对任何事物无需更改)。

例如:

(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,但是如果我交换commutealter或使用两个commute s或两个alter S,则在这种情况下会产生所需的结果(分别为3和1)。

>

我已经阅读了一些帖子,解释了commutealter的行为有些不同,因为commute实际上在交易中两次执行(一个是站立的地方,另一个处于"提交"阶段),而忽略了不一致的快照。裁判我只是对这两个组合的奇怪行为感到困惑。

任何人都可以帮助解释它是如何工作的吗?预先感谢!

commute功能仅在非常狭窄(即罕见)情况下有用,而 May 降低锁定的锁定为代价为更新功能的其他重新尝试。正如您的示例所示,这也使交易的心理模型变得更加复杂(例如,我以前从未见过这个特定问题)。

IMHO使用alter而不是commute几乎总是更好,因为alter更简单,更具防弹性。确实,我通常认为使用commute过早优化的情况

最新更新