簡體   English   中英

在Clojure stm的競爭條件?

[英]Race condition in Clojure stm?

您好我正在閱讀本書的快樂,並且在關於STM的部分中,他們有2個交易的圖像,其中A最初從參考中檢索與B相同的值,然后事務A和B都進行計算但是A完成首先,提交變量,因此B必須重試。

但我正在思考的是,B是否會重復A的提交。 如果是這樣的話那么如果相反呢? 那么最終的價值將明顯不同。

這似乎很容易被忽視,我相信我完全不理解它。 請幫我解開這個。

我們來看看例子:

(defn test-trans []
  (let [x (ref 1)
        t-inc #(dosync (alter x inc))
        t-mul #(dosync (alter x (partial * 2)))
        fns (flatten (repeat 10 [t-mul t-inc]))]
    (last (pmap (fn [f] (f)) fns))
    @x))

這里我們有2個事務函數 - 將x增加1並將x乘以2.我們並行應用20個這樣的函數(每種函數10個)並觀察ref最終值。 實際上每次運行的結果都不同:

=> (test-trans)
2418
=> (test-trans)
2380
=> (test-trans)
1804
=> (test-trans)
4210

實際上這是正確的行為。 STM保證代碼將在沒有鎖的情況下執行,並且以原子方式應用更改(它們不能僅部分應用)。 但是,它並不能保證我們對不同的交易順序會有相同的結果。

Clojure提供了很好的並行編程工具,可以簡化正確的代碼編寫。 但是避免這種競爭條件是開發人員的責任(實際上,這種情況是系統設計不良的明顯跡象)。

SQL的另一個例子:

DELETE FROM tbl WHERE col=1
UPDATE tbl SET col=2 WHERE col=1

如果這些查詢是並行執行的,那么無論什么隔離級別將用於事務 - 結果將取決於順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM