2011-03-25 32 views
4

我正在通過編程Clojure書。在解釋alter和STM時,他們說如果在更改過程中,Clojure檢測到事務外部對ref的更改,它將使用新值重新運行事務。如果是這樣的話,我會想象你傳入的更新函數需要是純的,但這並不在文檔中指出(在其他類似的情況下)。STM和改變clojure

那麼我的假設是否正確?如果不是,STM如何重新應用該功能?如果它是正確的,是不是可以依靠文檔告訴你什麼時候可以有副作用,什麼時候不能?

回答

8

它並不一定是純粹的,它必須是idempotent。在實踐中,這基本上是一回事。在STM之外看到的只有冪等性:如果你產生的唯一副作用是寫給某個其他參考資料,或者(我認爲)發送給代理,那麼這個操作將一直持續到你的交易已成功。

也不是這種情況:只是如果你的更新函數不是純的,結果可能不是你所期望的。

編輯:dosync的文檔告訴你,正文中的任何表達式可能會被執行多次。如果不運行dosync,則無法運行alter,因此它看起來像您需要的所有文檔都在那裏。你想改變什麼?

+0

我完全沒有想到看dosyncs文檔,我正在看alter,這在回想起來有點愚蠢。謝謝你的回答,完全是我在找的:) – 2011-03-25 03:42:56

4

正如一個側面說明:

如果您需要執行就像你STM TRANSATION登錄您可以發送郵件給代理商做非冪等部位的副作用。只有在交易完成並且保證只發送一次的情況下,纔會發送發送給座席的郵件。

1

Clojure中的一點是,在處理事務時沒有副作用,因爲它們的區域一致,並且在更新共享值期間發現衝突時該函數將重新運行(我更喜歡重試)否則它將會成功地改變這個變化。 如果必須重試,它將讀取更新後的值,因此沒有副作用,您可以找到的問題是Livelock,但是它受Clojure重試中的限制編號控制。