2013-06-19 30 views
4

在Clojure中,我們使用STM進行併發。Clojure STM模糊因子

我的問題是STM使用數據的時間點值,這不是引入歧義嗎?

我們怎麼知道訪問哪個值?

回答

4

在這種情況下,Clojurians使用「時間」和「價值」這兩個詞來表達非常具體的含義,以消除這種歧義。在這種情況下,'時間'是'時間在一個序列中'或劃時代,而不是時間,就像牆上的時間一樣。因此時間描述了該標識的值序列中的哪個值

價值是一個時間點身份不變的內容。該值可以是簡單的(原始值或原子值)或複合值,並由任意結構的不變值組成。最重要的部分是值不會改變,因此,如果你想知道哪些值使用,你可以簡單地打印或登錄其

我強烈reccommend上values, state and identity

8

的STM Clojure中提供此視頻(通過ref s和dosync)一個事務上下文,其中所有更新都保證在與外界查看時涉及的所有參與者「同時」進行。

目標是保持系統中的值的一致性,典型的例子是兩個銀行賬戶之間的資金轉移。如果您將帳戶A的100美元轉帳到帳戶B,則您需要同時更改A和B的金額。

在這個例子中實際上有一個在讀正在交易中處理的數量的值沒有歧義,因爲只有以下幾種情況都可以在瞬間從事務外讀做:

  1. 交易已經開始但尚未完成,所以價值未被「正式」更改。交易可以稍後提交或重試,但是當您閱讀它們時,這是每個賬戶的狀態。
  2. 交易已完成,所以讀取的金額是修改後的值。

當交易裏面,您只讀過ref S(不修改)可以自己的價值,從交易的一個點更改爲其他,這就是所謂的寫歪斜(見Clojure Programming - 第4章,參考,書寫偏斜)。爲了避免這種情況,您可以使用ensure(而不是deref),這將導致如果這些ref中的任何一個值發生更改(您只能讀取的值),那麼整個事務將被重試。