STM和改变clojure

问题描述:

我正在通过编程Clojure书。在解释alter和STM时,他们说如果在更改过程中,Clojure检测到事务外部对ref的更改,它将使用新值重新运行事务。如果是这样的话,我会想象你传入的更新函数需要是纯的,但这并不在文档中指出(在其他类似的情况下)。STM和改变clojure

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

它并不一定是纯粹的,它必须是idempotent。在实践中,这基本上是一回事。在STM之外看到的只有幂等性:如果你产生的唯一副作用是写给某个其他参考资料,或者(我认为)发送给代理,那么这个操作将一直持续到你的交易已成功。

也不是这种情况:只是如果你的更新函数不是纯的,结果可能不是你所期望的。

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

+0

我完全没有想到看dosyncs文档,我正在看alter,这在回想起来有点愚蠢。谢谢你的回答,完全是我在找的:) – 2011-03-25 03:42:56

正如一个侧面说明:

如果您需要执行就像你STM TRANSATION登录您可以发送邮件给代理商做非幂等部位的副作用。只有在交易完成并且保证只发送一次的情况下,才会发送发送给座席的邮件。

Clojure中的一点是,在处理事务时没有副作用,因为它们的区域一致,并且在更新共享值期间发现冲突时该函数将重新运行(我更喜欢重试)否则它将会成功地改变这个变化。 如果必须重试,它将读取更新后的值,因此没有副作用,您可以找到的问题是Livelock,但是它受Clojure重试中的限制编号控制。