【问题标题】:STM and alter in clojureSTM和clojure中的alter
【发布时间】:2011-03-25 02:02:44
【问题描述】:

我正在阅读 Programming Clojure 一书。在解释alter 和 STM 时,他们说如果在更改期间,Clojure 检测到来自事务外部对 ref 的更改,它将使用新值重新运行事务。如果是这种情况,我想您传入的更新函数需要是纯函数,但文档中没有说明(并且在其他类似情况下也是如此)。

那么我的假设正确吗?如果不是,STM如何重新应用该功能?如果正确,是不是就不能靠文档告诉你什么时候可以有副作用,什么时候不能?

【问题讨论】:

    标签: clojure stm


    【解决方案1】:

    它不一定是纯的,它必须是idempotent。实际上,这基本上是同一件事。

    此外,仅当在 STM 之外看到时,它才必须是幂等的:如果您产生的唯一副作用是写入某个其他 ref 或(我认为)发送给代理,那么该操作将一直保持到您的交易完成成功了。

    也不是真的必须是这些东西:只是,如果你的更新函数不是纯粹的,结果可能不是你所期望的。

    编辑:dosync 的文档告诉您,正文中的任何表达式都可能被多次执行。如果不运行dosync,您将无法运行alter,因此看起来您需要的所有文档都在那里。你想改变什么?

    【讨论】:

    • 我完全没想过要查看 dosyncs 文档,我正在查看 alter,回想起来有点愚蠢。感谢您的回答,完全是我想要的:)
    【解决方案2】:

    顺便说一句:

    如果您需要执行副作用,例如登录您的 STM 事务,您可以向代理发送消息以执行非幂等部分。发送给代理的消息仅在事务完成时发送,并且保证只发送一次。

    【讨论】:

      【解决方案3】:

      Clojure 中的重点是在处理 Transactions 时没有副作用,因为它们是一致的,并且当在 Shared Value 的更新过程中发现冲突时,该函数会重新运行(我更喜欢重试),否则它将成功提交更改。 如果它必须重试,它会读取更新的值,所以没有副作用,你可以找到一个活锁的问题,但它是受 Clojure 重试次数限制的控制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多