Clojure STM中用于银行交易的大数据结构LOOP

时间:2012-03-03 14:00:22

标签: clojure stm

我是功能编程和Clojure的新手,所以我不确定如何为大学的项目做些什么。该项目应显示Clojure STM对银行交易的优势(从账户A转账到账户B)。 所以我打算这样做:

  1. 定义初始数据,如Refs矩阵或更好的东西
  2. 生成随机操作以执行:[ random-account-source-id(0, N_MAX) , random-account-destination-id(0, N_MAX), random-money (0, 1000) ]
  3. 将交易插入数据结构
  4. 同步将所有资金从source-id转移到destination-id 矩阵中的插入,例如:
    
    for i=0; i lt N; i++;
        synchronize: transfer (matrix[i].source,matrix[i].dest,matrix[i].money)
    
  5. 我不确定这个,然后,也许:

    (defn do-all[]
      (dosync
        (when (pos? N)
          (transfer (get matrix [pos 1], get matrix [pos 2], get matrix [pos 3])))))
    

2 个答案:

答案 0 :(得分:6)

为每个帐户代表具有Ref,ref的帐户,并在dosync操作中执行汇款操作。还要确保在dosync操作中不进行任何副作用操作(除了那些参考),因为在更新refs时可能会发生冲突时重试。

<强>更新 如果您将修改帐户数量,那么您可以使用向量的ref,其中向量中的每个ref都是一个帐户,并且每个帐户都由向量中的索引标识。

例如:

(def total-accounts 100)
(def accounts (vec (map (fn [_] (ref 100)) (range total-accounts))))

如果您必须动态添加新帐户并按名称识别它们,则可以使用哈希映射,其中key是帐户ID(唯一值),value是帐户余额的Ref。如果您希望执行并行操作以从多个线程添加/删除帐户,则需要将此映射包装在Ref中。

答案 1 :(得分:4)

您可能对我在回复其他问题时发布的this example of Clojure's STM used for banking transactions感兴趣。